2011-10-26 101 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文件衝突而導致的任何複雜情況。