用于生成可执行Web应用程序的Maven插件(war->可执行jar-war)

时间:2013-01-06 15:07:10

标签: maven web-applications jetty war executable-jar

我有一个生成.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 
  1. Main.class应该使用etc配置作为默认配置,但能够在命令行(端口,上下文等)覆盖公共参数或指定新配置。
  2. Main.class应该能够从容器内部加载容器jar和配置(或者解压缩到tmp.dir)并启动appserver。
  3. 我就是这样做的。

    最后,你有一个正常的战争,可以在任何appserver中部署,并且能够以独立的方式运行。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:3)

使用maven jar插件在清单中设置Main-Class,然后使用类似于此的东西编写main方法(或调用类似这样的代码):

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/OneServletContext.java?h=jetty-8

您可以注册您的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直接从命令开始,就像你期望的那样。