blob: 20a333f6a711369325231be35cf0195305a49169 [file] [view]
# Struts Boot Hello
The smallest Struts Boot application: one action, one FreeMarker template, no `web.xml`, no `struts.xml`.
Struts Boot is experimental: its API and defaults may change between minor releases.
## Three steps
1. Depend on `org.apache.struts:struts2-boot-starter`, at the same version as the rest of Struts. Importing
`org.apache.struts:struts2-bom` in `<dependencyManagement>` keeps the versions aligned so the starter needs no
`<version>` of its own.
2. Implement `StrutsBootApplication` and register actions:
```java
public class HelloApp implements StrutsBootApplication {
public static void main(String[] args) {
StrutsBoot.run(HelloApp.class, args);
}
@Override
public void actions(ActionRegistry actions) {
actions.action("hello", HelloAction.class).success("hello.ftl");
}
}
```
3. Put the view in `src/main/resources/templates/hello.ftl` and run `main()`.
Then open http://localhost:8080/hello.action.
## Running the jar
```
mvn package -pl apps/boot-hello -am -DskipAssembly -DskipTests
java -jar apps/boot-hello/target/struts2-boot-hello-<version>.jar --struts.boot.port=9090
```
`<version>` is the Struts version being built, for example `struts2-boot-hello-7.5.0-SNAPSHOT.jar`. The example is
not deployed to Maven repositories; build it from source.
## Settings
Settings are read from `struts.properties` on the classpath. A `--key=value` argument overrides the file.
| Key | Default | Meaning |
|----------------------------|---------|--------------------------------------------|
| `struts.boot.port` | `8080` | HTTP port; `0` picks a free port |
| `struts.boot.context-path` | `""` | Context path the application is served at |
| `struts.boot.address` | all | Interface to listen on, e.g. `127.0.0.1` |
## Defaults worth knowing
- Tomcat listens on all interfaces, not only on localhost; set `struts.boot.address` to restrict it.
- Error pages show the status only, without stack traces or the Tomcat version.
- `struts.devMode` stays off.
- Each start uses a fresh temporary base directory (`struts-boot-<uuid>`) that is deleted on shutdown.
- Views are FreeMarker only; a result path such as `hello.ftl` resolves to `/templates/hello.ftl` on the classpath.
## Shading and plugins
The jar is built with `maven-shade-plugin`. Every Struts plugin ships its own `META-INF/struts-plugin.xml`, and shading
keeps only one file with that name, so with two or more plugins on the classpath all but one would be silently lost.
This example uses no plugins. If your application needs them, package it differently instead of shading: a thin jar
with its dependencies in a `lib/` directory (`maven-dependency-plugin` copies them, `maven-jar-plugin` writes the
`Class-Path` manifest entry), or a distribution built with `maven-assembly-plugin`.
## Logging
Struts logs through the Log4j 2 API, and the starter ships no logging backend, so warnings and errors from Struts are
not printed. Add one to your application, for example (version managed by `org.apache.logging.log4j:log4j-bom`):
```xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<scope>runtime</scope>
</dependency>
```
with a `log4j2.xml` on the classpath, or `log4j-slf4j2-impl` to route to an SLF4J backend.