Java App Engine Rules for Bazel
Bleh
Rules
Overview
These build rules are used for building Java App Engine application with Bazel. It does not aim at general Java web application support but can be easily modified to handle a standard web application.
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:
git_repository(
name = "io_bazel_rules_appengine",
remote = "https://github.com/bazelbuild/rules_appengine.git",
tag = "0.0.2",
)
load("@io_bazel_rules_appengine//appengine:appengine.bzl", "appengine_repositories")
appengine_repositories()
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:
load("@io_bazel_rules_appengine//appengine:appengine.bzl", "appengine_war")
java_library(
name = "mylib",
srcs = ["java/my/webapp/TestServlet.java"],
deps = [
"//external:appengine/java/api",
"@io_bazel_rules_appengine//appengine: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:
load("@io_bazel_rules_appengine//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",
"@io_bazel_rules_appengine//appengine: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.
appengine_war
appengine_war(name, jars, data, data_path)
Attributes | |
---|---|
name |
Name, required
A unique name for this rule. |
jars |
List of labels, required
List of JAR files that will be uncompressed as the code for the Web Application. 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. |
data |
List of files, optional
List of files used by the Web Application at runtime. This attribute can be used to specify the list of resources to be included into the WAR file. |
data_path |
String, optional
Root path of the data. 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. |
java_war
java_war(name, data, data_path, **kwargs)
Attributes | |
---|---|
name |
Name, required
A unique name for this rule. |
data |
List of labels, optional
List of files used by the Web Application at runtime. Passed to the appengine_war rule. |
data_path |
String, optional
Root path of the data. Passed to the appengine_war rule. |
**kwargs |
see java_library
The other arguments of this rule will be passed to build a `java_library` that will be passed in the `jar` arguments of a appengine_war rule. |