1

我有一个 servlet,它有一些逻辑,并且像每个 servlet 一样通过浏览器使用。现在我正在寻找方法来做与 servlet 相同的事情,但它应该像 CLI 一样工作。CLI 将请求发送到部署在 JBoss 上的逻辑(war 文件中的类)并在终端(命令行)上打印响应。它应该触发相同的逻辑,所有东西都应该放在这个war文件中。

因此,假设我将编写提供此功能的 java 代码。它应该被编译成jar并放在war中,然后这个jar应该从war中启动。它不必是 servlet。唯一的要求是一切都应该在这个战争文件中。CLI 应该通过一行调用,例如 java -cp jarfileinwar com.blah.Main。

逻辑应该在部署了所有东西的 JBoss JVM 上工作,它应该像 servlet 一样工作,但调用方法应该是 CLI。

问候

4

2 回答 2

0

可执行 jar 文件的结构与 war 文件的结构不同,因此我认为您不会成功地尝试创建可执行的 war 文件。

但是,您可以将所需的类和 jar 依赖项中的类重新打包到一个大的“uber jar”中,然后通过属性清单条目使其可执行。

手动执行此操作并不简单,因此我建议使用构建工具来完成此操作。Maven 有两个插件——Shade 插件和更新的(我认为)Maven Assembly 插件,可以很容易地做到这一点。

使用 Maven 的一个好处是您可以有两个不同的目标 - 一个用于构建 war 文件,一个用于构建来自同一个项目的可执行 jar 文件。

于 2013-01-04T22:05:18.613 回答
0

我无法停止思考。正如我对原始帖子的评论一样,我认为可以通过在 WAR 中模仿可执行 JAR 来使 WAR 文件可执行。

在 Maven 3 web 项目 arche 类型(作为基础)之上,我创建了一个小的概念证明项目,它实际上实现了这一点。

看一看:

https://github.com/is-already-taken/executable-war-example

它使用了一个自定义类加载器(这篇关于 javablogging.com 的类加载器的文章帮我搞定了这个),一个“引导”类,它使用我们的自定义类加载器和一个自定义清单加载业务逻辑的第一部分。类加载器用于“拦截”类加载以在类通常位于 WAR 文件中的位置搜索类,并使用流式解压缩代码从 WAR 文件中打包的库中提取类。

可能还有这种开箱即用的解决方案或者Maven插件自带的东西,但是我没有找到。此外,这个小的概念证明也帮助我学习了类 cloader 的东西。;)

我期待着对我的解决方案和我的总体方法发表评论。

于 2013-01-16T21:34:34.143 回答