我有一个生成.war文件的maven项目。
我想配置maven来生成一个可执行jar,它嵌入一个servlet容器(jetty,tomcat或其他)以及我的war应用程序,并生成一个可执行jar,它可以运行我的web应用程序,其命令如下: p>
java -jar mywebapp.war
是否有maven插件来获取此类工件?
目前我正在使用jetty-runner来运行我的应用程序的测试版本,它对于测试来说非常令人满意,但不像重新分发那样方便,因为它可能是可执行的战争(就像在jenkins中一样)。
@ jesse-mcconnell:我不想在我的Web应用程序中更改单行(pom.xml除外)以实现结果。只是以不同的方式打包我的战争,并使其可以在所选的应用程序服务器下部署,并且能够将其作为可执行战争运行。
一个完美的解决方案还应该让我能够选择嵌入哪个appserver,同时指定可执行战争中包含的所有必需的配置文件。
@khmarbaise:我知道jenkins,我已经检查了很长时间的代码,它使用了winstone servlet容器,并且在war中可以放入一个Main.class,可以从http访问(我认为这是错误的)
完美的解决方案可能会产生包含以下内容的战争:
├── META-INF
│ └── MANIFEST.MF (Main-Class: WEB-INF.container.classes.Main)
└── WEB-INF
├── web.xml
├── classes
├── lib
└── container
├── lib (jetty.jar/tomcat.jar/whatever.jar)
├── etc (configuration files for the container)
└── classes
└── Main.class
我就是这样做的。
最后,你有一个正常的战争,可以在任何appserver中部署,并且能够以独立的方式运行。
答案 0 :(得分:4)
Tomcat Maven插件可以查看http://tomcat.apache.org/maven-plugin-2.0/executable-war-jar.html
HTH
答案 1 :(得分:3)
使用maven jar插件在清单中设置Main-Class,然后使用类似于此的东西编写main方法(或调用类似这样的代码):
您可以注册您的servlet并相应地连接webapp。
在jar文件中正确捆绑war文件的问题是你需要一个专门的部署者,它能理解从jar中部署war文件,而不是常见的事情。所以创建一个超级型jar可能是更好的方法。此外,实际的WebAppContext的一个重要原因是类加载器隔离,在这些情况下有点没有实际意义。
您可以使用maven-dependency-plugin来解压缩所需的各种依赖项。你可以使用其他插件,比如maven-uberjar-plugin(我认为这就是名字),但是你可以使用maven-dependency-plugin +一个类似上面的自定义主类来完成它。
我喜欢这种方法,因为你最终得到一个主方法,你可以在eclipse中运行,启动整个应用程序,让你调试整个事情,通常是一个很好的胜利。
编辑:对于后代,jetty还发布了一个名为jetty-runner的工件,允许直接从命令行运行war文件
答案 2 :(得分:2)
不,我知道,但检查jenkins source code which supports直接从命令开始,就像你期望的那样。