Native Package Management in JFrog CLI

JFrog Applications and CLI Documentation

JFrog CLI provides two modes of operation when running package managers: Wrapped Mode and Native Mode. This guide explains the differences between these modes and how to enforce fully native package-manager behaviour when needed.

Wrapped Mode

In Wrapped Mode, JFrog CLI intercepts certain package-manager commands to provide Artifactory-aware features, such as:

  • Automatic repository resolution

  • Injection of registry/source configuration into project files

  • Enhanced dependency resolution

  • Automatic build-info collection (when flags like --build-name / --build-number are supplied)

  • Consistent authentication and resolution via JFrog CLI config

Wrapped Mode is the recommended flow for most Artifactory-integrated development workflows.

Native Mode

Native Mode disables all JFrog CLI wrapping and allows the package manager to run exactly as its upstream client would, while still providing build-info collection capabilities.

Enable Native Mode with:

export JFROG_RUN_NATIVE=true

When Native Mode is enabled:

  • No Artifactory configuration or repositories are injected into project files

  • No CLI YAML (.jfrog/projects/*.yml) is applied

  • No wrapped behaviour is executed (e.g., no automatic dependency updates, no metadata alterations)

  • The package manager uses its own configuration, as set through native package manager commands (e.g., poetry source add, poetry config, mvn settings.xml) or directly in project files

  • Lock files and metadata remain untouched

  • Build-info is collected after the native command executes (when --build-name and --build-number are provided)

  • Build-info collection reads configuration directly from project files (e.g., pyproject.toml for Poetry, pom.xml for Maven)

  • Execution is fully deterministic and aligned with the original client tooling

Note

Important: Even in Native Mode, you must use jf <package-manager> commands (e.g., jf poetry, jf mvn). The "native" refers to how the package manager itself executes, not that you bypass JFrog CLI entirely.

Supported Package Managers

Here are the package managers and their default execution modes:

  • Packages with Native Mode by Default

    • Helm

    • Conan

  • Packages that Do NOT Have Native Mode by Default (Run in Wrapped Mode)

    These packages require manual steps to run in Native Mode:

    • Maven (Requires export JFROG_RUN_NATIVE=true)

    • Poetry (Requires export JFROG_RUN_NATIVE=true)

    • Gradle (Requires manual setup and native Gradle commands)

    • Docker (Requires manual setup, including docker login, and native Docker commands)

When to Use Which Mode

Use Wrapped Mode when you want:

  • Integrated Artifactory resolution

  • Automatic build-info capture with minimal configuration

  • Managed repository configuration via JFrog CLI

  • Consistent, unified behaviour across machines and CI environments

  • Minimal configuration overhead

Use Native Mode when you need:

  • Strict lockfile fidelity — Zero modifications to lock files

  • Zero modification to project metadata (pom.xml, pyproject.toml, lock files, etc.) by JFrog CLI

  • Full compatibility with the upstream package manager's behaviour

  • Deterministic builds that must be fully reproducible across environments

  • Version-controlled repository configuration (e.g., repositories defined in pyproject.toml or pom.xml)

  • Custom or advanced workflows configured directly in the package manager

  • Direct control over repository configuration in project files

FAQ: Wrapped Mode vs. Native Mode (Condensed)

1.

What are the two modes for package managers in JFrog CLI?

Wrapped Mode and Native Mode.

2.

What is Wrapped Mode?

The recommended mode. JFrog CLI provides Artifactory features like automatic repository resolution and build-info collection.

3.

What is Native Mode?

It disables JFrog CLI wrapping. It is used for strict lockfile fidelity and zero modification to project metadata.

4.

How do I enable Native Mode?

Set the environment variable: export JFROG_RUN_NATIVE=true. (Note: Helm and Conan are native by default).