2011-10-26 70 views
2

有没有人成功使用嵌入式Tomcat 7制作独立的.war文件?有了Maven。嵌入Tomcat的自包含war文件?

我指的是“自成一体”,战争的文件也可以在命令行中使用:

Java的罐子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的嵌入核心 - 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 
+0

我认为一般来说,如果你想提供一个嵌入式web服务器/ web服务,那么jetty是最简单的方法(http://jetty.codehaus.org/jetty/) – trojanfoe

+0

我同意。但其中一个库不适合Jetty 7和8.这就是为什么我尝试使用嵌入式Tomcat。其中直接工作。 (不知道它是否存在于今天之前。) –

+0

罐子里面的罐子是否可能不被支持? –

回答

2

我试过各种图书馆,但是我可能没有做任何工作,完全想要做什么。你有那些聪明的类加载技巧来保持战争文件。而且你已经得到了将所有jar分解成单独文件并将它们全部塞进一个可执行jar的文件。

在我发现的第一个类别中,Winstone是我能找到的最好的。只需添加插件,重建并运行即可。事实上,有些东西将战争部署到嵌入式Web容器中。不幸的是,这不足以运行复杂的Web应用程序。

当解压包含相同路径文件的jar文件时,由于文件冲突,我排除了第二类解决方案。典型的META-INF/....更准确地说是Spring相关的元数据。必须将其合并成一个文件。否则,应用程序根本无法启动。

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

这很容易实现,任何人都可以启动它。虽然我宁愿保留jar文件,但这样可以避免由于类加载或爆炸的jar文件冲突而导致的任何复杂情况。