blob: 0b047c9203c03460492ecdf2bb3cc061bd3be5f9 [file] [log] [blame] [view]
# Java App Engine Rules for Bazel
<div class="toc">
<h2>Rules</h2>
<ul>
<li><a href="#appengine_war">appengine_war</a></li>
<li><a href="#java_war">java_war</a></li>
</ul>
</div>
## Overview
These build rules are used for building
[Java App Engine](https://cloud.google.com/appengine/docs/java/)
application with Bazel. It does not aim at general Java web application
support but can be easily modified to handle a standard web application.
<a name="setup"></a>
## Setup
To be able to use the Java App Engine rules, you must make the App Engine SDK
available to Bazel. The easiest way to do so is by adding the following to your
`WORKSPACE` file:
```python
load("@bazel_tools//tools/build_rules/appengine:appengine.bzl", "appengine_repositories")
appengine_repositories()
```
<a name="basic-example"></a>
## Basic Example
Suppose you have the following directory structure for a simple App Engine
application:
```
[workspace]/
WORKSPACE
hello_app/
BUILD
java/my/webapp/
TestServlet.java
webapp/
index.html
webapp/WEB-INF
web.xml
appengine-web.xml
```
Then, to build your webapp, your `hello_app/BUILD` can look like:
```python
load("@bazel_tools//tools/build_rules/appengine:appengine.bzl", "appengine_war")
java_library(
name = "mylib",
srcs = ["java/my/webapp/TestServlet.java"],
deps = [
"//external:appengine/java/api",
"//external:javax/servlet/api",
],
)
appengine_war(
name = "myapp",
jars = [":mylib"],
data = glob(["webapp/**"]),
data_path = "webapp",
)
```
For simplicity, you can use the `java_war` rule to build an app from source.
Your `hello_app/BUILD` file would then look like:
```python
load("@bazel_tools//tools/build_rules/appengine:appengine.bzl", "java_war")
java_war(
name = "myapp",
srcs = ["java/my/webapp/TestServlet.java"],
data = glob(["webapp/**"]),
data_path = "webapp",
deps = [
"//external:appengine/java/api",
"//external:javax/servlet/api",
],
)
```
You can then build the application with `bazel build //hello_app:myapp` and
run in it a development server with `bazel run //hello_app:myapp`. This will
bind a test server on port 8080. If you wish to select another port,
simply append the `--port=12345` to the command-line.
Another target `//hello_app:myapp.deploy` allows you to deploy your
application to App Engine. It takes an optional argument: the
`APP_ID`. If not specified, it uses the default `APP_ID` provided in
the application. This target needs to be authorized to App Engine. Since
Bazel does not connect the standard input, it is easier to run it by:
```
bazel-bin/hello_app/myapp.deploy APP_ID
```
After the first launch, subsequent launch will be registered to
App Engine so you can just do a normal `bazel run
//hello_app:myapp.deploy APP_ID` to deploy next versions of
your application.
<a name="appengine_war"></a>
## appengine_war
```python
appengine_war(name, jars, data, data_path)
```
<table class="table table-condensed table-bordered table-params">
<colgroup>
<col class="col-param" />
<col class="param-description" />
</colgroup>
<thead>
<tr>
<th colspan="2">Attributes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule.</p>
</td>
</tr>
<tr>
<td><code>jars</code></td>
<td>
<code>List of labels, required</code>
<p>
List of JAR files that will be uncompressed as the code for the
Web Application.
</p>
<p>
If it is a `java_library` or a `java_import`, the
JAR from the runtime classpath will be added in the `lib` directory
of the Web Application.
</p>
</td>
</tr>
<tr>
<td><code>data</code></td>
<td>
<code>List of files, optional</code>
<p>List of files used by the Web Application at runtime.</p>
<p>
This attribute can be used to specify the list of resources to
be included into the WAR file.
</p>
</td>
</tr>
<tr>
<td><code>data_path</code></td>
<td>
<code>String, optional</code>
<p>Root path of the data.</p>
<p>
The directory structure from the data is preserved inside the
WebApplication but a prefix path determined by `data_path`
is removed from the the directory structure. This path can
be absolute from the workspace root if starting with a `/` or
relative to the rule's directory. It is set to `.` by default.
</p>
</td>
</tr>
</tbody>
</table>
<a name="java_war"></a>
## java_war
```
java_war(name, data, data_path, **kwargs)
```
<table class="table table-condensed table-bordered table-params">
<colgroup>
<col class="col-param" />
<col class="param-description" />
</colgroup>
<thead>
<tr>
<th colspan="2">Attributes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule.</p>
</td>
</tr>
<tr>
<td><code>data</code></td>
<td>
<code>List of labels, optional</code>
<p>List of files used by the Web Application at runtime.</p>
<p>Passed to the <a href="#appengine_war">appengine_war</a> rule.</p>
</td>
</tr>
<tr>
<td><code>data_path</code></td>
<td>
<code>String, optional</code>
<p>Root path of the data.</p>
<p>Passed to the <a href="#appengine_war">appengine_war</a> rule.</p>
</td>
</tr>
<tr>
<td><code>**kwargs</code></td>
<td>
<code>see <a href="http://bazel.io/docs/be/java.html#java_library">java_library</a></code>
<p>
The other arguments of this rule will be passed to build a `java_library`
that will be passed in the `jar` arguments of a
<a href="#appengine_war">appengine_war</a> rule.
</p>
</td>
</tr>
</tbody>
</table>