包含Tomcat的自包含战争文件? [英] Self-contained war file with Tomcat embedded?

查看:71
本文介绍了包含Tomcat的自包含战争文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何人使用嵌入式Tomcat 7成功制作了独立的.war文件?有了Maven.

Is there anyone who has succeeded in making a self-contained .war file using Tomcat 7 embedded ? With Maven that is.

我的意思是独立",战争文件也可以在命令行中用作:

I mean with "self-contained" that the war file can also be used at the command line as:

java -jar application.war

java -jar application.war

使用它应获取META-INF/MANIFEST.MF的主类,并使用提供的嵌入式Tomcat 7运行该应用程序.

With which it should pick up the Main Class of META-INF/MANIFEST.MF and run the application with the provided embedded Tomcat 7.

我设法使它像这样运行,但是我似乎无法将其打包到具有相同功能的.war文件中.

I managed to make it run as such, but I can't seem to be able to package it into a .war file that does the same.

有人链接到某种文档吗?

Anybody has a link to documentation of some sorts ?

TIA !!!

Jan

从pom.xml添加摘录:

Adding an extract from the 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()方法的类.而且,尽管一切似乎都已准备就绪,但我仍然得到:

Where "EmbeddedMain" is the class containing the main() method. And although everything seems to be in its place, I'm still getting:

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.MF seems to be okay: WEB-INF/lib/tomcat-embed-core-7.0.22.jar contains the missing class.

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的功能.

I've tried various libraries but I could make none work fully to what I want to do. You've got those that do clever classloading tricks to keep the war file as is. And you've got those which explode all jars into separate files and cram it all into an executable jar.

在第一类中,我发现Winstone是我所能找到的最好的.只需添加插件,重建并运行即可.确实,有些事情将战争部署到了嵌入式Web容器中.不幸的是,它不够强大,无法运行复杂的Web应用程序.

Of the first category I found that Winstone was the best I could find. Just add the plugin, rebuild and run. And indeed, something deploys the war into an embedded web container. Which is unfortunately not powerful enough to run a complex web application.

我正在排除第二类的解决方案,因为解压缩包含相同路径的文件的jar时文件冲突.通常是META-INF/....更确切地说是与Spring相关的元数据.必须将其合并到一个文件中.否则,该应用程序将无法启动.

I'm ruling out solutions of the second category because of the file conflicts when decompressing jars containing files at the same path. Typically META-INF/.... And more precisely the Spring related meta data. Which has to be merged together into a single file. Otherwise the application simply doesn't start.

我选择了第三种解决方案:让可执行jar包含war文件.运行时,它将把war文件提取到一个临时目录中,并使用刚刚提取的war文件运行嵌入式Web容器(在我的情况下为Tomcat).另外,在正确的URL上打开浏览器.

I've opted for a third kind of solution: Have the executable jar contain the war file as such. When it is run, it will extract the war file into a temporary directory and run the embedded web container (in my case Tomcat) using the just extracted war file. Additionally opening a browser on the right url.

这很容易实现,任何人都可以启动它.尽管我本来希望保留jar文件,但这样可以避免由于类加载或jar文件冲突引起的任何麻烦.

It's easy to implement and anybody can start it. Although I would have preferred to keep the jar file as such, this avoids any complications due to class loading or exploded jar file clashes.

这篇关于包含Tomcat的自包含战争文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆