有没有人使用嵌入式Tomcat 7成功制作了独立的.war文件?与Maven的是。
我的意思是“独立”战争文件也可以在命令行中用作:
java -jar application.war
它应该使用它来获取META-INF / MANIFEST.MF的主类,并使用提供的嵌入式Tomcat 7运行该应用程序。
我设法使其按原样运行,但似乎无法将其打包为一个具有相同功能的.war文件。
有人链接到某种文档吗?
TIA!
一月
从pom.xml添加摘录:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <archive> <manifest> <mainClass>EmbeddedMain</mainClass> <addClasspath>true</addClasspath> <classpathPrefix>WEB-INF/lib/</classpathPrefix> </manifest> </archive> <webResources> <resource> <directory>target/classes</directory> </resource> </webResources> </configuration> </plugin>
其中“ EmbeddedMain”是包含main()方法的类。尽管一切似乎都已经到位,但我仍然得到:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/catalina/LifecycleListener Caused by: java.lang.ClassNotFoundException: org.apache.catalina.LifecycleListener 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:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Could not find the main class: EmbeddedMain. Program will exit.
MANIFEST.MF似乎还可以:WEB-INF / lib / tomcat-embed-core-7.0.22.jar包含缺少的类。
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: jan Build-Jdk: 1.6.0_29 Main-Class: EmbeddedMain Class-Path: WEB-INF/lib/spring-web-3.0.6.RELEASE.jar WEB-INF/lib/aopal liance-1.0.jar WEB-INF/lib/spring-beans-3.0.6.RELEASE.jar WEB-INF/lib /spring-core-3.0.6.RELEASE.jar WEB-INF/lib/jwt-3.1.11.jar WEB-INF/lib /commons-fileupload-1.2.1.jar WEB-INF/lib/commons-io-1.4.jar WEB-INF/ lib/next-persistence-0.0.3.jar WEB-INF/lib/hibernate-entitymanager-3. 6.7.Final.jar WEB-INF/lib/hibernate-core-3.6.7.Final.jar WEB-INF/lib/ antlr-2.7.6.jar WEB-INF/lib/dom4j-1.6.1.jar WEB-INF/lib/hibernate-com mons-annotations-3.2.0.Final.jar WEB-INF/lib/jta-1.1.jar WEB-INF/lib/ cglib-2.2.jar WEB-INF/lib/javassist-3.12.0.GA.jar WEB-INF/lib/hiberna te-jpa-2.0-api-1.0.1.Final.jar WEB-INF/lib/kryo-1.04.jar WEB-INF/lib/ asm-3.2.jar WEB-INF/lib/reflectasm-1.01.jar WEB-INF/lib/minlog-1.2.ja r WEB-INF/lib/annotations-1.3.9.jar WEB-INF/lib/tomcat-embed-core-7.0 .22.jar WEB-INF/lib/tomcat-embed-jasper-7.0.22.jar WEB-INF/lib/tomcat -embed-logging-juli-7.0.22.jar WEB-INF/lib/derby-10.8.1.2.jar WEB-INF /lib/spring-context-3.0.6.RELEASE.jar WEB-INF/lib/spring-aop-3.0.6.RE LEASE.jar WEB-INF/lib/spring-expression-3.0.6.RELEASE.jar WEB-INF/lib /spring-asm-3.0.6.RELEASE.jar WEB-INF/lib/spring-orm-3.0.6.RELEASE.ja r WEB-INF/lib/spring-jdbc-3.0.6.RELEASE.jar WEB-INF/lib/spring-tx-3.0 .6.RELEASE.jar WEB-INF/lib/commons-lang-2.5.jar WEB-INF/lib/slf4j-api -1.6.3.jar WEB-INF/lib/slf4j-log4j12-1.6.3.jar WEB-INF/lib/log4j-1.2. 14.jar WEB-INF/lib/jcl-over-slf4j-1.6.3.jar WEB-INF/lib/commons-loggi ng-1.1.jar WEB-INF/lib/commons-collections-3.2.jar
我已经尝试过各种库,但是我无法使它们完全发挥作用。您已经拥有了一些巧妙的类加载技巧来将war文件保持原样。而且您已经拥有将所有jar爆炸到单独文件中并将其全部塞入可执行jar中的功能。
在第一类产品中,我发现Winstone是我所能找到的最好的产品。只需添加插件,重建并运行即可。确实,有些东西将战争部署到了嵌入式Web容器中。不幸的是,它不够强大,无法运行复杂的Web应用程序。
我正在排除第二类的解决方案,因为解压缩包含相同路径的文件的jar时文件冲突。通常是META-INF / ....更确切地说是与Spring相关的元数据。必须将其合并到一个文件中。否则,该应用程序将无法启动。
我选择了第三种解决方案:让可执行jar包含war文件。运行时,它将把war文件提取到一个临时目录中,并使用刚刚提取的war文件运行嵌入式Web容器(在我的情况下为Tomcat)。此外,在正确的网址上打开浏览器。
它很容易实现,任何人都可以启动它。尽管我本来希望将jar文件保持这样,但这样可以避免由于类加载或jar文件冲突引起的任何复杂情况。