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

生成可执行web应用程序的Maven插件(war->;可执行jar war),maven,web-applications,jetty,war,executable-jar,Maven,Web Applications,Jetty,War,Executable Jar,我有一个maven项目正在生成一个.war文件 我想将maven配置为生成一个可执行jar,该jar嵌入一个servlet容器(jetty、tomcat或其他)和我的war应用程序,并生成一个可执行jar,该jar可以使用如下命令运行我的web应用程序: java -jar mywebapp.war 有没有maven插件可以获得这样的工件 目前,我正在使用它来运行我的应用程序的测试版本,这对于测试来说是非常令人满意的,但对于重新分发来说,它并不像一场可执行的战争那样方便(比如在詹金斯) 更新

我有一个maven项目正在生成一个.war文件

我想将maven配置为生成一个可执行jar,该jar嵌入一个servlet容器(jetty、tomcat或其他)和我的war应用程序,并生成一个可执行jar,该jar可以使用如下命令运行我的web应用程序:

java -jar mywebapp.war
有没有maven插件可以获得这样的工件

目前,我正在使用它来运行我的应用程序的测试版本,这对于测试来说是非常令人满意的,但对于重新分发来说,它并不像一场可执行的战争那样方便(比如在詹金斯)

更新 @jesse mcconnell:我不想在我的web应用程序中更改一行代码(pom.xml除外)来实现这个结果。这只是一个问题,以不同的方式打包我的war,并将其部署在所选的appserver下,再加上能够将其作为可执行war运行

一个完美的解决方案还应该让我能够选择嵌入哪个appserver,还可以指定可执行war本身中包含的所有必需的配置文件

@khmarbaise:我知道jenkins,很久以前我已经检查过代码,它使用winstone servlet容器,并且它在战争中放置了一个可以从http访问的Main.class(我认为这是错误的)

一个完美的解决方案可能会引发一场包含以下内容的战争:

├── 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 
  • Main.class应该默认使用etc配置,但能够覆盖命令行(端口、上下文等)上的公共参数或指定新配置
  • class应该能够从容器内部加载容器jar和配置(或者提取到tmp.dir),并启动appserver
  • 我会这样做的


    最后,您有了一个普通的war,它可以部署在任何appserver中,并能够以自包含的方式运行。

    我知道没有,但请检查直接从命令开始,就像您期望的那样。

    使用maven jar插件在清单中设置Main类,然后编写一个与此类似的Main方法(或这样调用代码):

    您可以注册servlet并相应地连接webapp

    将war文件捆绑到jar文件中的问题是,您需要一个专门的部署人员,能够理解如何在jar中部署war文件,这不是一件常见的事情。因此,创建一个uber类型的jar可能是更好的方法。此外,实际WebAppContext的一个重要原因是类加载器隔离,它在这种情况下是没有意义的

    你可以使用maven依赖插件来解压你所需要的各种依赖项。你也可以使用其他插件,比如maven uberjar插件(我想这就是它的名字),但是你可以简单地使用maven依赖插件+一个类似于上面的自定义主类

    我喜欢这种方法,因为您最终得到了一个可以在eclipse中运行的主方法,它可以启动整个应用程序并让您调试整个程序,这通常是一个很大的成功


    编辑:对于后人来说,jetty还发布了一个名为jetty runner的工件,它允许直接从命令行运行war文件


    Hth

    如果它不存在,我会在这种情况下,你需要一个定制的IMPL来处理这个方法所带来的所有类加载器问题……也许是扩展到CalthWorkS之类的东西,FIWW没有想到在这样的一个盒子外的实现中,这将是我认为这个问题的最终解决方案。t、 另外,一个不完美(但有效)的解决方案也是受欢迎的。顺便说一句,我现在正在查看一些代码,我希望类加载问题不会那么难解决。检查过了;还可以。它生成一个包含war的jar,然后在运行时提取它。我想,我最终会按照我的方式执行mojo。