blob: 246a064c380efbcd5161186c6887eec9f83c182b [file] [log] [blame] [view]
---
layout: documentation
title: Generate external dependencies for a Java project
---
> NOTE: `generate_workspace` is no longer maintained by the Bazel team. The
GitHub project has been archived. Instead, please use [`rules_jvm_external`](
https://github.com/bazelbuild/rules_jvm_external) to fetch and resolve
Maven artifacts transitively.
# Generate External Dependencies from Maven Projects
The tool `generate_workspace` helps automate the process of writing
the WORKSPACE file for a Java project. This tool is
helpful when the list of external dependencies is long, such as when working
with [external transitive dependencies](external.html#transitive-dependencies).
The `generate_workspace` tool will generate a `generate_workspace.bzl` file
which includes:
* the `generated_maven_jars` macro that will contain the transitive
dependencies, and
* the `generated_java_libraries` macro that will contain a library for
each maven_jar.
## Install `generate_workspace`
Bazel's binary installer does not include `generate_workspace`. To be able to
use this tool:
1. Clone Bazel's migration tooling repo:
```
git clone https://github.com/bazelbuild/migration-tooling.git
```
2. Run the following to build the `generate_workspace` tool and see usage:
```
bazel run //generate_workspace
```
## Generate a list of external dependencies
1. Run the `generate_workspace` tool.
When you run the tool, you can specify Maven projects (that is,
directories containing a `pom.xml` file), or Maven artifact coordinates
directly. For example:
```bash
$ bazel run //generate_workspace -- \
> --maven_project=/path/to/my/project \
> --artifact=groupId:artifactId:version \
> --artifact=groupId:artifactId:version \
> --repositories=https://repo1.maven.org/maven2
Wrote
/usr/local/.../generate_workspace.runfiles/__main__/generate_workspace.bzl
```
The tool creates one outputs, a `generate_workspace.bzl` file that contains
two macros:
1. The `generated_maven_jars` macro that will contain the transitive
dependencies of the given projects and artifacts.
2. The `generated_java_libraries` macro will contain a library
for each maven_jar.
If you specify multiple Maven projects or artifacts, they will all be
combined into one `generate_workspace.bzl` file. For example, if an
artifact depends on junit and the Maven project also depends on junit, then
junit will only appear once as a dependency in the output.
2. Copy the `generate_workspace.bzl` file to your workspace. The `.bzl`
file's original location is listed in the commandline output.
To access external dependencies:
1. Add the following to your WORKSPACE file:
```
load("//:generate_workspace.bzl", "generated_maven_jars")
generated_maven_jars()
```
You can now access any of the jars in `generate_workspace.bzl`.
This reference points to the jar, but not to any dependencies
that the jar itself may have. To have a target depend on one of these
jars, you must list the jar as well as each of that jar's dependencies.
For example, to depend on the Guava jar from the
[Guava project](https://github.com/google/guava/tree/master/guava),
in the target definition you will need to list the jar and its
transitive dependencies:
```bash
deps = [
"@com_google_guava_guava//jar",
"@com_google_code_findbugs_jsr305//jar",
"@com_google_errorprone_error_prone_annotations//jar",
"@com_google_j2objc_j2objc_annotations//jar",
]
```
2. Optionally, you can also access the libraries. When you list a library
as a dependency, the transitive dependencies are already included, and
so you don't need to list them manually.
To access the libraries, add the following to a BUILD file:
```
load("//:generate_workspace.bzl", "generated_java_libraries")
generated_java_libraries()
```
The recommended location for this BUILD file is in a directory called
`third_party`.
You can now access any of the Java library targets in
`generate_workspace.bzl`.
For example, for a target to depend on Guava and its transitive
dependencies, in the target definition you will need to list:
```bash
deps = ["//third_party:com_google_guava_guava"]
```
3. Ensure `generate_workspace.bzl` lists the correct version of each
dependency.
If several different versions of an artifact are requested (for example, by
different libraries that depend on it), then `generate_workspace` chooses
a version and annotates the `maven_jar` with the other versions requested.
Here's an example of the contents of `generate_workspace.bzl`:
```python
# org.springframework:spring:2.5.6
# javax.mail:mail:1.4
# httpunit:httpunit:1.6 wanted version 1.0.2
# org.springframework:spring-support:2.0.2 wanted version 1.0.2
# org.slf4j:nlog4j:1.2.24 wanted version 1.0.2
native.maven_jar(
name = "javax_activation_activation",
artifact = "javax.activation:activation:1.1",
)
```
The example above indicates that `org.springframework:spring:2.5.6`,
`javax.mail:mail:1.4`, `httpunit:httpunit:1.6`,
`org.springframework:spring-support:2.0.2`, and `org.slf4j:nlog4j:1.2.24`
all depend on `javax.activation`. However, two of these libraries wanted
version 1.1 and three of them wanted 1.0.2. The WORKSPACE file is using
version 1.1, but that might not be the right version to use.