Wykonywalny plik war, który uruchamia się bez Mavena
Próbuję stworzyć" wykonywalny " plik wojenny (java -jar myWarFile.war
), który uruchomi serwer internetowy Jetty, który hostuje webapp zawarty w pliku wojennym, który wykonałem.
Znalazłem stronę opisującą jak zrobić to czego szukam:
Jednak przestrzeganie tej Rady wraz z tym, jak myślę, że mam zrobić plik wykonywalny jar (war), nie działa.
Mam zadanie Ant tworząc plik wojenny z manifestem, który wygląda następująco:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.1 Created-By: 1.5.0_18-b02 (Sun Microsystems Inc.) Main-Class: Start
Spis treści plik WAR wygląda następująco:
> Start.class
> jsp
> build.jsp
> META-INF
> MANIFEST.MF
> WEB-INF
> lib
> jetty-6.1.22.jar
> jetty-util.6.1.22.jar
Kiedy próbuję uruchomić plik WAR, pojawia się błąd:
Exception in thread "main" java.lang.NoClassDefFoundError: org/mortbay/jetty/Handler
Caused by: java.lang.ClassNotFoundException: org.mortbay.jetty.Handler
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: Start. Program will exit.
Wydaje się, że są tu dwa błędy: jeden, w którym nie można znaleźć plików JAR, a drugi, w którym nie można znaleźć Klasy Start
.
Aby naprawić pierwszy, umieściłem pliki Jetty JAR w bazie pliku WAR i spróbowałem ponownie -- ten sam błąd. Próbowałem też dodać WEB-INF/lib/<specific-JAR-files>
do atrybutu Class-Path
manifestu. To też nie zadziałało.
Czy ktoś ma jakieś wgląd w to, co robię dobrze/źle i jak mogę uruchomić ten plik wykonywalny WAR?
9 answers
Link , który masz w swoim pytaniu, zapewnia większość tego, czego potrzebujesz. Istnieje jednak kilka rzeczy, które należy zrobić oprócz tego.
Pliki klas, które Jetty musi uruchomić, muszą znajdować się w katalogu głównym pliku war, gdy jest pakowany. Możemy zmusić Ant ' a do zrobienia tego za nas, zanim przejdziemy do pliku. Plik manifestu wojny będzie również potrzebował atrybutu Main-Class
do uruchomienia serwera.
Oto krok po kroku:
Stwórz swój Jetty Klasa serwera:
jest to dostosowane z podanego linku.
package com.mycompany.myapp;
import java.io.File;
import java.net.URL;
import java.security.ProtectionDomain;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.webapp.WebAppContext;
public final class EmbeddedJettyServer
{
public static void main(String[] args) throws Exception
{
int port = Integer.parseInt(System.getProperty("port", "8080"));
Server server = new Server(port);
ProtectionDomain domain = EmbeddedJettyServer.class.getProtectionDomain();
URL location = domain.getCodeSource().getLocation();
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setDescriptor(location.toExternalForm() + "/WEB-INF/web.xml");
webapp.setServer(server);
webapp.setWar(location.toExternalForm());
// (Optional) Set the directory the war will extract to.
// If not set, java.io.tmpdir will be used, which can cause problems
// if the temp directory gets cleaned periodically.
// Your build scripts should remove this directory between deployments
webapp.setTempDirectory(new File("/path/to/webapp-directory"));
server.setHandler(webapp);
server.start();
server.join();
}
}
Aby zobaczyć, co możesz tutaj skonfigurować, zajrzyj do dokumentacji Jetty API.
Zbuduj wojnę z mrówką:
używa katalogu pośredniczącego do rozpakowania niezbędnych plików klas do katalogu głównego wojny, aby były dostępne po zakończeniu wojny.
<target name="war" description="--> Creates self-executing war">
<property name="staging.dir" location="${basedir}/staging"/>
<property name="webapp.dir" location="${basedir}/src/webapp"/>
<mkdir dir="${staging.dir}"/>
<!-- assumes you have all of your war content (excluding classes and libraries) already structured in a directory called src/webapp -->
<!-- e.g. -->
<!-- src/webapp/index.html -->
<!-- src/webapp/WEB-INF/web.xml -->
<!-- src/webapp/WEB-INF/classes/my.properties -->
<!-- etc ... -->
<copy todir="${staging.dir}">
<fileset dir="${webapp.dir}" includes="**/*"/>
</copy>
<unjar dest="${staging.dir}">
<!-- 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="path/to/jetty/jars">
<include name="ant-1.6.5.jar"/>
<include name="core-3.1.1.jar"/>
<include name="jetty-6.1.24.jar"/>
<include name="jsp-2.1-glassfish-2.1.v20091210.jar"/><!-- your JSP implementation may vary -->
<include name="jsp-api-2.1-glassfish-2.1.v20091210.jar"/><!-- your JSP implementation may vary -->
<include name="servlet-api-2.5-20081211.jar"/><!-- your Servlet API implementation may vary -->
</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>
<!-- copy in the class file built from the above EmbeddedJettyServer.java -->
<copy todir="${staging.dir}">
<fileset dir="path/to/classes/dir" includes="com/mycompany/myapp/EmbeddedJettyServer.class"/>
</copy>
<war destfile="myapp.war" webxml="${webapp.dir}/WEB-INF/web.xml">
<fileset dir="${staging.dir}" includes="**/*"/>
<classes dir="path/to/classes/dir"/><!-- your application classes -->
<lib dir="path/to/lib/dir"/><!-- application dependency jars -->
<manifest>
<!-- add the Main-Class attribute that will execute our server class -->
<attribute name="Main-Class" value="com.mycompany.myapp.EmbeddedJettyServer"/>
</manifest>
</war>
<delete dir="${staging.dir}"/>
</target>
Jeśli wszystko jest ustawione poprawnie powyżej, powinieneś być "able to": {]}
java -jar myapp.war
// or if you want to configure the port (since we are using the System property in the code)
java -Dport=8443 -jar myapp.war
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 18:56:08
To jest adaptacja dla Mavena odpowiedzi @ RobHruska. Po prostu kopiuje pliki klasy main i łączy pliki Jetty JAR z plikiem WAR, nic nowego, tylko po to, aby uprościć swoje życie, jeśli jesteś nowy-jak ja - Mavenowi: {]}
<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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 18:47:58
Rozgryzliśmy to używając jetty-console-maven-plugin.
Po uruchomieniu pakietu mvn tworzy on kolejną wojnę, która może być użyta z 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>
Generuje również init.Skrypty d i wszystko dla Ciebie!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-17 14:37:13
Hudson rozwiązuje ten problem używając kontenera serwletów Winstone, który obsługuje ten przypadek użycia bezpośrednio. http://winstone.sourceforge.net/#embedding
Być może to zadziała dla Ciebie?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 12:30:46
Mimo, że jest to trochę stare, inną alternatywą z Jetty 8 jest po prostu dołączenie słoików Jetty jako zależności w Twoim pom i dodanie następujących elementów w Twoim pom (w przeciwieństwie do skryptu ant, który rozpakowuje wojnę i przepakowuje ją):
<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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-16 14:32:44
Rozumiem, że przez "bez Mavena" chcesz jar, który możesz uruchomić sam, a nie z "mvn jetty: run" -- nie, że nie chcesz używać Mavena w ogóle.
Długo mi to zajęło, bo znalazłem wiele opcji. żadna z nich nie jest prosta. W końcu znalazłem tę wtyczkę Mavena z simplericity . Działa wspaniale.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-02 02:04:56
To jest mój przykład wyciąg z mrówki. Chodzi o to, aby rozpakować zależności Jetty, a następnie dołączyć je lokalnie, tak jak normalny plik JAR:
<!-- 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>
Uwaga:
Katalog WEB-INF/lib jest przeznaczony dla zależności aplikacji internetowych. W tym przypadku pakujemy plik WAR tak, aby działał jak normalny plik Jetty JAR przy starcie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 20:43:28
- Putting .słoiki w środku A.war file root does nothing
- Putting .jars inside
WEB-INF/lib
nie pomaga JVM znaleźć pliki Jetty, aby nawet rozpocząć uruchamianie .wojna. Jest "za późno", żeby je tam umieścić. - Putting .jars w ścieżce klas manifest działa tylko dla zewnętrznych .pliki jar, a nie te zawarte w .jar
Więc co robić?
- Użyj skryptu budowania, aby po prostu połączyć wszystkie .pliki jar potrzebne do .akta wojenne. To wymaga dodatkowej pracy. Jest też trochę brzydki w tym, że skompilowany kod jest częścią serwowalnych plików w .war
- Dodaj zależne .jars do JVM ' s classpath z "java-cp jetty.jar:... ..."Działa, choć tego rodzaju zaprzecza celowi jednego samodzielnego .war
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 01:23:31
Robiłem już podobne rzeczy, ale czy uruchamiacie aplikację jako "java-jar xxx. war"?. Masz tylko 2 słoiki i to chyba nie wystarczy. Spróbuj również użyć Jetty 7.0 .0M1 (która jest najnowszą wersją). Kiedy dodałem jetty-server i Jetty-webapp jako dwie zależności (są one z org.zaćmienie.jetty) dostaję następujący jar w katalogu lib. FYI org.mortbay.pomost.Handler był w jetty-server*.słoik.
- jetty-kontynuacja-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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 12:27:19