aboutsummaryrefslogtreecommitdiffhomepage
path: root/site/docs/generate-workspace.md
blob: 5f8a1be9aeb04afdc414db1e8305bf426fa0578f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
---
layout: documentation
title: Generate external dependencies for a Java project
---

# 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 dependnecies](/docs/external.html#external-packages).

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
    Wrote:
    /tmp/1437415510621-0/2015-07-20-14-05-10.WORKSPACE
    /tmp/1437415510621-0/2015-07-20-14-05-10.BUILD
    ```

2.  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.

        If you specify multiple Maven projects or artifacts,
        they will all be combined into one `WORKSPACE` 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.  The `generated_java_libraries` macro will contain a library
        for each maven_jar.

3.  Copy the `generate_workspace.bzl` file to your workspace, and 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`.

4.  Ensure `generate_workspace.bzl` lists the correct version of each
    dependency.

    If several different versions of an artifact are requested (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.