---
title: 'java\_common'
---

Utilities for Java compilation support in Starlark.

## Members

* [BootClassPathInfo](#BootClassPathInfo)
* [compile](#compile)
* [JavaRuntimeInfo](#JavaRuntimeInfo)
* [JavaToolchainInfo](#JavaToolchainInfo)
* [merge](#merge)
* [pack\_sources](#pack_sources)
* [run\_ijar](#run_ijar)
* [stamp\_jar](#stamp_jar)

## BootClassPathInfo

```
Provider java_common.BootClassPathInfo
```

The provider used to supply bootclasspath information

## compile

```
struct java_common.compile(ctx, *, source_jars=[], source_files=[], output, output_source_jar=None, javac_opts=[], deps=[], runtime_deps=[], exports=[], plugins=[], exported_plugins=[], native_libraries=[], annotation_processor_additional_inputs=[], annotation_processor_additional_outputs=[], strict_deps='ERROR', java_toolchain, bootclasspath=None, sourcepath=[], resources=[], resource_jars=[], classpath_resources=[], neverlink=False, enable_annotation_processing=True, enable_compile_jar_action=True, add_exports=[], add_opens=[])
```

Compiles Java source files/jars from the implementation of a Starlark rule and returns a provider that represents the results of the compilation and can be added to the set of providers emitted by this rule.

### Parameters

| Parameter | Description |
| --- | --- |
| `ctx` | [ctx](/versions/9.0.0/rules/lib/builtins/ctx); required  The rule context. |
| `source_jars` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]`  A list of the jars to be compiled. At least one of source\_jars or source\_files should be specified. |
| `source_files` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]`  A list of the Java source files to be compiled. At least one of source\_jars or source\_files should be specified. |
| `output` | [File](/versions/9.0.0/rules/lib/builtins/File); required |
| `output_source_jar` | [File](/versions/9.0.0/rules/lib/builtins/File); or `None`; default is `None`  The output source jar. Defaults to `{output\_jar}-src.jar` if unset. |
| `javac_opts` | [sequence](/versions/9.0.0/rules/lib/core/list) of [string](/versions/9.0.0/rules/lib/core/string)s; default is `[]`  A list of the desired javac options. |
| `deps` | [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; default is `[]`  A list of dependencies. |
| `runtime_deps` | [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; default is `[]`  A list of runtime dependencies. |
| `exports` | [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; default is `[]`  A list of exports. |
| `plugins` | [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; or [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; default is `[]`  A list of plugins. |
| `exported_plugins` | [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; or [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; default is `[]`  A list of exported plugins. |
| `native_libraries` | [sequence](/versions/9.0.0/rules/lib/core/list) of [CcInfo](/versions/9.0.0/rules/lib/providers/CcInfo)s; default is `[]`  CC native library dependencies that are needed for this library. |
| `annotation_processor_additional_inputs` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]`  A list of inputs that the Java compilation action will take in addition to the Java sources for annotation processing. |
| `annotation_processor_additional_outputs` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]`  A list of outputs that the Java compilation action will output in addition to the class jar from annotation processing. |
| `strict_deps` | [string](/versions/9.0.0/rules/lib/core/string); default is `'ERROR'`  A string that specifies how to handle strict deps. Possible values: 'OFF', 'ERROR', 'WARN' and 'DEFAULT'. For more details see [`--strict_java_deps flag`](/versions/9.0.0/docs/user-manual#flag--strict_java_deps). By default 'ERROR'. |
| `java_toolchain` | Info; required  A JavaToolchainInfo to be used for this compilation. Mandatory. |
| `bootclasspath` | default is `None`  A BootClassPathInfo to be used for this compilation. If present, overrides the bootclasspath associated with the provided java\_toolchain. |
| `sourcepath` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]` |
| `resources` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]` |
| `resource_jars` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]` |
| `classpath_resources` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]` |
| `neverlink` | [bool](/versions/9.0.0/rules/lib/core/bool); default is `False` |
| `enable_annotation_processing` | [bool](/versions/9.0.0/rules/lib/core/bool); default is `True`  Disables annotation processing in this compilation, causing any annotation processors provided in plugins or in exported\_plugins of deps to be ignored. |
| `enable_compile_jar_action` | [bool](/versions/9.0.0/rules/lib/core/bool); default is `True`  Enables header compilation or ijar creation. If set to False, it forces use of the full class jar in the compilation classpaths of any dependants. Doing so is intended for use by non-library targets such as binaries that do not have dependants. |
| `add_exports` | [sequence](/versions/9.0.0/rules/lib/core/list) of [string](/versions/9.0.0/rules/lib/core/string)s; default is `[]`  Allow this library to access the given /. |
| `add_opens` | [sequence](/versions/9.0.0/rules/lib/core/list) of [string](/versions/9.0.0/rules/lib/core/string)s; default is `[]`  Allow this library to reflectively access the given /. |

## JavaRuntimeInfo

```
Provider java_common.JavaRuntimeInfo
```

The key used to retrieve the provider that contains information about the Java runtime being used.

## JavaToolchainInfo

```
Provider java_common.JavaToolchainInfo
```

The key used to retrieve the provider that contains information about the Java toolchain being used.

## merge

```
struct java_common.merge(providers)
```

Merges the given providers into a single JavaInfo.

### Parameters

| Parameter | Description |
| --- | --- |
| `providers` | [sequence](/versions/9.0.0/rules/lib/core/list) of [struct](/versions/9.0.0/rules/lib/builtins/struct)s; required  The list of providers to merge. |

## pack\_sources

```
File java_common.pack_sources(actions, *, output_source_jar=None, sources=[], source_jars=[], java_toolchain)
```

Packs sources and source jars into a single source jar file. The return value is typically passed to

`JavaInfo#source_jar`

.At least one of parameters output\_jar or output\_source\_jar is required.

### Parameters

| Parameter | Description |
| --- | --- |
| `actions` | [actions](/versions/9.0.0/rules/lib/builtins/actions); required  ctx.actions |
| `output_source_jar` | [File](/versions/9.0.0/rules/lib/builtins/File); or `None`; default is `None`  The output source jar. |
| `sources` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]`  A list of Java source files to be packed into the source jar. |
| `source_jars` | [sequence](/versions/9.0.0/rules/lib/core/list) of [File](/versions/9.0.0/rules/lib/builtins/File)s; default is `[]`  A list of source jars to be packed into the source jar. |
| `java_toolchain` | Info; required  A JavaToolchainInfo to used to find the ijar tool. |

## run\_ijar

```
File java_common.run_ijar(actions, *, jar, target_label=None, java_toolchain)
```

Runs ijar on a jar, stripping it of its method bodies. This helps reduce rebuilding of dependent jars during any recompiles consisting only of simple changes to method implementations. The return value is typically passed to `JavaInfo#compile_jar`.

### Parameters

| Parameter | Description |
| --- | --- |
| `actions` | [actions](/versions/9.0.0/rules/lib/builtins/actions); required  ctx.actions |
| `jar` | [File](/versions/9.0.0/rules/lib/builtins/File); required  The jar to run ijar on. |
| `target_label` | [Label](/versions/9.0.0/rules/lib/builtins/Label); or `None`; default is `None`  A target label to stamp the jar with. Used for `add_dep` support. Typically, you would pass `ctx.label` to stamp the jar with the current rule's label. |
| `java_toolchain` | Info; required  A JavaToolchainInfo to used to find the ijar tool. |

## stamp\_jar

```
File java_common.stamp_jar(actions, *, jar, target_label, java_toolchain)
```

Stamps a jar with a target label for `add_dep` support. The return value is typically passed to `JavaInfo#compile_jar`. Prefer to use `run_ijar` when possible.

### Parameters

| Parameter | Description |
| --- | --- |
| `actions` | [actions](/versions/9.0.0/rules/lib/builtins/actions); required  ctx.actions |
| `jar` | [File](/versions/9.0.0/rules/lib/builtins/File); required  The jar to run stamp\_jar on. |
| `target_label` | [Label](/versions/9.0.0/rules/lib/builtins/Label); required  A target label to stamp the jar with. Used for `add_dep` support. Typically, you would pass `ctx.label` to stamp the jar with the current rule's label. |
| `java_toolchain` | Info; required  A JavaToolchainInfo to used to find the stamp\_jar tool. |