Executable war file that starts jetty without maven

后端 未结 9 507
野趣味
野趣味 2020-12-04 05:03

I\'m trying to make an \"executable\" war file (java -jar myWarFile.war) that will start up a Jetty webserver that hosts the webapp contained in the WAR file I

相关标签:
9条回答
  • 2020-12-04 05:35

    I have done a similar thing before but are you launchign the app as "java -jar xxx.war" ?. You have only 2 jars and it is not going to be enough I think. Also try using Jetty 7.0.0M1 (which is the latest version). When I added jetty-server and jetty-webapp as two dependencies (they are from org.eclipse.jetty) I get the following jar's in the lib directory. FYI the org.mortbay.jetty.Handler was in the jetty-server*.jar.

    • jetty-continuation-7.0.0.M1.jar
    • jetty-http-7.0.0.M1.jar
    • jetty-io-7.0.0.M1.jar
    • jetty-security-7.0.0.M1.jar
    • jetty-server-7.0.0.M1.jar
    • jetty-servlet-7.0.0.M1.jar
    • jetty-util-7.0.0.M1.jar
    • jetty-webapp-7.0.0.M1.jar
    • jetty-xml-7.0.0.M1.jar
    0 讨论(0)
  • 2020-12-04 05:41
    • Putting .jars inside a .war file root does nothing
    • Putting .jars inside WEB-INF/lib doesn't help the JVM find the Jetty files to even begin launching your .war. It's "too late" to put them there.
    • Putting .jars in the manifest Class-Path only works for external .jar files, not those contained in the .jar

    So what to do?

    • Use a build script to simply merge all the .jar files you need into the .war file. This takes a little extra work. It's also a bit ugly in that the compiled code is part of the servable files in the .war
    • Add dependent .jars to the JVM's classpath with "java -cp jetty.jar:... ..." Works though this kind of defeats the purpose of one stand-alone .war
    0 讨论(0)
  • 2020-12-04 05:42

    This is my example ANT extract. The idea is to unpackage the Jetty dependencies and then include them locally just like a normal JAR file:

    <!-- Hack: Java doesn't support jars within jars/wars -->
    <unjar src="${lib.dir}/container/jetty.jar" dest="${build.dir}/unjar"/>
    <unjar src="${lib.dir}/container/jetty-util.jar" dest="${build.dir}/unjar"/>
    <unjar src="${lib.dir}/container/servlet-api.jar" dest="${build.dir}/unjar"/>
    <unjar src="${lib.dir}/container/jsp-api.jar" dest="${build.dir}/unjar"/>
    
    <!-- Build war file as normal, just including the compiled and unjar'ed files -->
    <war destfile="${war.file}" webxml="${config.dir}/web.xml">
        <fileset dir="${build.dir}/classes"/>
        <fileset dir="${build.dir}/unjar"/>
        <fileset dir="${resources.dir}" excludes="*.swp"/>
        <lib dir="${lib.dir}/runtime"/>
        <manifest>
            <attribute name="Main-Class" value="Start"/>
        </manifest>
    </war>
    

    Note:

    The WEB-INF/lib direcory is for the web applications dependencies. In this case we're packaging the WAR file so that it works like the normal Jetty JAR file on startup

    0 讨论(0)
  • 2020-12-04 05:47

    We have figured this out by using jetty-console-maven-plugin.

    Whenever you run mvn package it creates another war that can be used with java -jar whateverpackage-runnable.war

            <plugin>
                <groupId>org.simplericity.jettyconsole</groupId>
                <artifactId>jetty-console-maven-plugin</artifactId>
                <version>1.45</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>createconsole</goal>
                        </goals>
                    </execution>
                </executions>
    
                <configuration>
                    <additionalDependencies>
                        <additionalDependency>
                            <artifactId>jetty-console-requestlog-plugin</artifactId>
                        </additionalDependency>
                        <additionalDependency>
                            <artifactId>jetty-console-gzip-plugin</artifactId>
                        </additionalDependency>
                        <additionalDependency>
                            <artifactId>jetty-console-ajp-plugin</artifactId>
                        </additionalDependency>
                        <additionalDependency>
                            <artifactId>jetty-console-startstop-plugin</artifactId>
                        </additionalDependency>
                    </additionalDependencies>
                </configuration>
            </plugin>
    

    It also generates the init.d scripts and everything for you!

    0 讨论(0)
  • 2020-12-04 05:47

    Even though this is kind of old another alternative with Jetty 8 is to simply include the Jetty jars as dependencies in your pom and add the following in your pom (versus an ant script that unpackages the war and repackages it):

                <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <createDependencyReducedPom>true</createDependencyReducedPom>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>JettyStandaloneMain</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- The main class needs to be in the root of the war in order to be 
                runnable -->
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>move-main-class</id>
                        <phase>compile</phase>
                        <configuration>
                            <tasks>
                                <move todir="${project.build.directory}/${project.build.finalName}">
                                    <fileset dir="${project.build.directory}/classes/">
                                        <include name="JettyStandaloneMain.class" />
                                    </fileset>
                                </move>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    
    0 讨论(0)
  • 2020-12-04 05:49

    This is an adaptation for Maven of @RobHruska's answer. It just copies the files of the main class and merges the Jetty JAR files into the WAR file, nothing new, just to simplify your life if you are new -like me- to Maven:

    <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
            <execution>
                <id>move-main-class</id>
                <phase>compile</phase>
                <configuration>
                    <tasks>
                        <copy todir="${project.build.directory}/${project.build.finalName}">
                            <fileset dir="${project.build.directory}/${project.build.finalName}/WEB-INF/classes/">
                                <include name="main/*.class" />
                            </fileset>
                        </copy>
    
                        <unjar dest="${project.build.directory}/${project.build.finalName}">
                            <!-- you'll have to locate these jars or appropriate versions; note that these include JSP support -->
                            <!-- you might find some of them in the downloaded Jetty .tgz -->
                            <fileset dir="${project.build.directory}/${project.build.finalName}/WEB-INF/lib/">
                                <include name="ant-1.6.5.jar"/>
                                <!--<include name="core-3.1.1.jar"/>-->
                                <include name="jetty*"/>
                                <include name="servlet-api*"/>
                            </fileset>
    
                            <patternset><!-- to exclude some of the stuff we don't really need -->
                                <exclude name="META-INF/**/*"/>
                                <exclude name="images/**/*"/>
                                <exclude name=".options"/>
                                <exclude name="about.html"/>
                                <exclude name="jdtCompilerAdapter.jar"/>
                                <exclude name="plugin*"/>
                            </patternset>
                        </unjar>
                    </tasks>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
    </plugin> 
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <archiveClasses>true</archiveClasses>
            <archive>
                <manifest>
                    <mainClass>main.Main</mainClass> 
                </manifest>
            </archive>
        </configuration>
    </plugin>
    
    0 讨论(0)
提交回复
热议问题