Java web programming includes a servlet architecture for making server applications in java and having the nitty gritty of managing the web server part of the application to a web server that functions as a servlet container. One popular embedded server for Java projects is Jetty.
You can create a java server project that embeds Jetty and run it on the MetaArray on your assigned port. Below is a very simple example on how to get started with that. It doesn't use any IDE, so it's a bit manual. You can find more detailed directions at the external project links below.
There are lots of different java web frameworks that center around using the Jetty server, including a few microframeworks. This page is going to go through an example using Javalin, which is a microframework that has a lighter footprint and is easier to configure than Spring Boot and other more mainline frameworks. It has a simple tutorial that was used and modified a bit here to show you how to set up a Java Jetty server. To make things quick to set up, we'll use Maven (mvn
).
First, let's create your maven-style project folder.
mkdir -p src/main/java/myproject
Next, let's set up the POM file, which maven will use to pull all the dependencies for our framework and let us build it.
pom.xml
nano pom.xml
<project> <!-- model version - always 4.0.0 for Maven 2.x POMs --> <modelVersion>4.0.0</modelVersion> <!-- project coordinates - values which uniquely identify this project --> <groupId>myproject.helloWorld</groupId> <artifactId>helloWorld</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>1.8</maven.compiler.target> </properties> <!-- library dependencies --> <dependencies> <dependency> <groupId>io.javalin</groupId> <artifactId>javalin</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.31</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.0</version> <configuration> <source>1.8</source> <target>1.8</target> <showDeprecation/> <showWarnings/> <compilerArgs> <arg>-Xlint:unchecked</arg> <arg>-Xlint:all</arg> <arg>-Xlint:-serial</arg> </compilerArgs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.19.1</version> <configuration> <systemPropertyVariables> <java.util.logging.config.file>src/main/resources/logging.properties</java.util.logging.config.file> </systemPropertyVariables> </configuration> </plugin> <plugin> <!-- Exec plugin lets us run app directly from maven and not deal with classpaths --> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <!-- This is what exec will run as project main, *CHANGE THIS IF YOU ARE USING A DIFFERENT MAIN CLASS--> <mainClass>myproject.helloWorld</mainClass> </configuration> </plugin> </plugins> </build> </project>
nano src/main/java/myproject/helloWorld.java
package myproject; import io.javalin.Javalin; public class helloWorld { private static int MY_JETTY_PORT= 8388; //replace 8388 with your port as explained in the wiki public static void main(String[] args){ Javalin app = Javalin.create().start(MY_JETTY_PORT); app.get("/", ctx -> ctx.result("Hello World, this is my Java App on Jetty!")); } }
Here we go. Back at the command line, type
mvn package
You will see a bunch of log info scroll by, but at the end, you should see something like this:
[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.537 s [INFO] Finished at: 2022-01-20T21:04:04Z [INFO] ------------------------------------------------------------------------
Now, let's run the server. We've set up an “exec goal” in the POM so we can run the resulting project from maven, like so:
mvn exec:java
You should see something like this (hopefully any warnings you get are ignorable):
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release [INFO] Scanning for projects... [INFO] [INFO] ------------------< myproject.helloWorld:helloWorld >------------------- [INFO] Building helloWorld 1.0.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ helloWorld --- [myproject.helloWorld.main()] INFO io.javalin.Javalin - __ __ _ __ __ / /____ _ _ __ ____ _ / /(_)____ / // / __ / // __ `/| | / // __ `// // // __ \ / // /_ / /_/ // /_/ / | |/ // /_/ // // // / / / /__ __/ \____/ \__,_/ |___/ \__,_//_//_//_/ /_/ /_/ https://javalin.io/documentation [myproject.helloWorld.main()] INFO org.eclipse.jetty.util.log - Logging initialized @2496ms to org.eclipse.jetty.util.log.Slf4jLog [myproject.helloWorld.main()] INFO io.javalin.Javalin - Starting Javalin ... [myproject.helloWorld.main()] INFO io.javalin.Javalin - You are running Javalin 4.3.0 (released January 13, 2022). [myproject.helloWorld.main()] INFO io.javalin.Javalin - Listening on http://localhost:32056/ [myproject.helloWorld.main()] INFO io.javalin.Javalin - Javalin started in 263ms \o/
If you get here, then your server is running! Now try it out: point your web browser to http://yourusername.yourSDFmetarraydomain.org:yourMetaArrayPort and see it if works!
Press ctl-c
to stop the server.
The rest is up to your imagination!