Table of Contents

Setting up a simple Java Jetty Server

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

Create Project Space

First, let's create your maven-style project folder.

  1. Go to an appropriate project folder that you want to work in
  2. make the java source folder in the maven style
    • mkdir -p src/main/java/myproject

Create Project Object Model

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.

  1. Create a new file in “myproject”, call it pom.xml
    • nano pom.xml
  2. Paste in the following:
    <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>
    
  3. Save the file

Add Your Java Code

  1. Using an editor again, create your hello world class file, in its proper folder for maven:
    1. nano src/main/java/myproject/helloWorld.java
    2. paste in the following:
      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!"));
          }
      }
  2. move the cursor up and change the value of MY_JETTY_PORT to be your Port on the MetaArray (that is, replace 8388 with your UID number).
  3. save the file

Build Your Project

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] ------------------------------------------------------------------------

Run Your Server

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!