4

我有一个生成 .war 文件的 Maven 项目。

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

java -jar mywebapp.war

是否有一个 Maven 插件来获取这样的工件?

目前我正在使用jetty-runner运行我的应用程序的测试版本,这对于测试来说非常令人满意,但对于重新分发来说不如它是一个可执行的战争(就像在 jenkins 中)那样方便。

更新

@jesse-mcconnell:我不想更改我的 Web 应用程序中的一行(除了 pom.xml)来实现结果。只需以不同的方式打包我的战争,并使其可在选择的应用服务器下部署,并且能够将其作为可执行战争运行。

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

@khmarbaise:我知道 jenkins,我很久以前就检查过代码,它使用 winstone servlet 容器,并将 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 中)并启动应用服务器。

这就是我要做的。

最后,您有一个正常的战争,可以部署在任何应用服务器中,并能够以独立的方式运行。

4

3 回答 3

4

Tomcat Maven 插件可以看看这里http://tomcat.apache.org/maven-plugin-2.0/executable-war-jar.html

高温高压

于 2013-01-07T14:18:38.743 回答
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 文件,而不是常见的事情。所以创建一个超级类型的罐子可能是更好的方法。此外,实际 WebAppContext 的一个重要原因是类加载器隔离,在这些情况下这有点没有意义。

您可以使用 maven-dependency-plugin 解压您需要的各种依赖项。您可以使用其他插件,例如 maven-uberjar-plugin(我认为这就是名称),但您可以简单地使用 maven-dependency-plugin + 类似于上述的自定义主类来完成。

我喜欢这种方法,因为你最终得到了一个可以在 eclipse 中运行的 main 方法,它可以启动整个应用程序并让你也可以调试整个事情,这通常是一个胜利。

编辑:对于后代,jetty 还发布了一个名为 jetty-runner 的工件,允许直接从命令行运行战争文件

于 2013-01-06T16:17:15.567 回答
2

不,我知道,但请检查支持直接从命令开始的詹金斯源代码,就像您期望的那样。

于 2013-01-06T16:05:28.900 回答