gpt4 book ai didi

java - 嵌入了 Tomcat 的自包含 war 文件?

转载 作者:行者123 更新时间:2023-11-30 09:44:26 24 4
gpt4 key购买 nike

有没有人成功地使用 Tomcat 7 embedded 制作了一个独立的 .war 文件?使用 Maven。

我的意思是“自包含”war 文件也可以在命令行中使用:

java -jar 应用程序.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 是我能找到的最好的。只需添加插件,重建并运行。事实上,有些东西将 war 部署到嵌入式网络容器中。遗憾的是,它的功能不足以运行复杂的 Web 应用程序。

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

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

它易于实现,任何人都可以开始使用。虽然我更愿意保留 jar 文件,但这避免了由于类加载或分解的 jar 文件冲突而导致的任何复杂情况。

关于java - 嵌入了 Tomcat 的自包含 war 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com