编辑:我想我应该澄清一下我的意图...

我正在尝试简化编写代码>>构建WAR>>部署>>刷新>>重复的开发迭代周期。我希望相对独立于 IDE(即,我不希望 Eclipse 或 IntelliJ 插件来完成这项工作)。我希望能够编辑代码/静态文件并根据需要构建到我的 WAR 源目录中,并且只需将运行/调试设置作为对集中式 Jetty 安装的命令行调用即可。

稍后我希望能够使用大致相同的设置但使用打包的 WAR 来执行实际部署。我不想让我的应用程序代码特定于我的 IDE 或 Jetty。

所以也许问这个问题的更好方法是 您发现使用 Jetty 作为开发/调试应用程序服务器的最简洁方法是什么?


假设我想要最小化 Jetty 7 安装。我想要尽可能少的 XML 配置,我只需要原始 Servlet API,不需要 JSP,不需要过滤等。我只是希望能够拥有一些自定义 servlet 并提供静态文件(如果存在)。这将是唯一的 WAR,它将作为给定端口的根。

理想情况下,为了便于部署,我希望 Jetty 目录成为标准下载,并且我的 WAR / XML 配置与这些标准 Jetty 文件分开。在调用 Jetty 时,我想传递这个最小的 XML 并运行。

我发现文档到处都是,其中大部分是针对 Jetty 6 或特定于各种其他包(Spring 等)的。我想如果我有这个最小的配置,那么在上面添加额外的抽象就会干净得多。它还将使我能够更干净地处理嵌入式 Jetty 场景。

这个 SO 问题是一个示例场景,其中此 XML 很有用 Jetty Run War 仅使用命令行

指定这一 WAR 位置和为其提供服务的主机/端口所需的最少 XML 是什么?

预先感谢您提供任何片段或链接。

有帮助吗?

解决方案

Jetty 已迁移到 Eclipse。这方面有非常微妙的信息。这也导致了包名称的变化,这是另一个层面的细微差别。他们确实发布了一个实用程序来将 Jetty6 设置转换为 Jetty 7 设置,但同样不是很受欢迎。我对 Eclipse Jetty 论坛感到失望。您应该在此处查找有关 Jetty 7 及以上版本的文档 http://wiki.eclipse.org/Jetty/Starting

我认为这是最小的 jetty.xml 取自 http://wiki.eclipse.org/Jetty/Reference/jetty.xml

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">\ 
<Configure id="Server" class="org.eclipse.jetty.server.Server">
</Configure>

但是,我宁愿从副本开始 $JETTY_HOME/etc/jetty.xml 并会从那里修改。

如果你同意 $JETTY_HOME/webapps 目录下,可以通过修改这部分来设置端口

<Configure id="Server" class="org.eclipse.jetty.server.Server">
    ...
    <Call name="addConnector">
      <Arg>
          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <Set name="host"><Property name="jetty.host" /></Set>
            <Set name="port"><Property name="jetty.port" default="7777"/></Set>
            <Set name="maxIdleTime">300000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="confidentialPort">8443</Set>
        <Set name="lowResourcesConnections">20000</Set>
        <Set name="lowResourcesMaxIdleTime">5000</Set>
          </New>
      </Arg>
    </Call>
    ....
</Configure>

不然我就修改一下 context.xml 这里解释的方式(对于 Jetty 7) 如何从 portA 提供 webbapp A 并从 portB 提供 webapp B

另请参阅这些页面:

....编辑#1:抱歉,每个连接器的 Web 应用程序 URL 错误。我已将链接更新为 如何从 portA 提供 webbapp A 并从 portB 提供 webapp B 指向适用于 Jetty 7 的文档。


更新 关于“您如何在各种环境下处理 Jetty?”

开发者

我们使用 Maven,因此嵌入式 Jetty 适合我们。我们只是跑 mvn clean install run:jetty 并且端口在Maven的配置文件中配置,即 pom.xml. 。这是 不是 IDE 依赖加上 Jetty 可以很容易地使用 ANT 嵌入,但我从未尝试过。

测试

我们有独立的码头运行。我已经配置了端口并调整了参数,删除了默认应用程序(例如root.war 等)并创建了一个包含应用程序特定端口和部署目录的 context.xml。(不幸的是,我已经在 Eclipse Jetty 的邮件列表中提出了这个问题,但没有人愿意回答)。这是一次性设置。

对于测试构建/部署,我们有一个构建脚本,可以根据测试环境规范构建 WAR,然后将其上传到测试环境。之后,我们调用一个 shell 脚本,该脚本 (1) 停止 Jetty,(2) 将 war 文件复制到 myApp 的 webapp 目录,以及 (3) 重新启动 Jetty。

然而,更简单的方法是使用 Maven 的 Cargo 插件。不幸的是我使用的是 Jetty 7.1.6,它与 Cargo 不兼容。后来他们修复了它,但我已经通过自定义脚本完成了我的工作。

产品

除了测试之外,产品的过程几乎与测试相同。进行调整是为了提高安全性和负载平衡。但从部署 POV 来看,测试用例到产品没有什么不同。

请注意,我并没有关心 XML 文件是什么以及其中必须有多少个。我刚刚使用了我关心的那些—— jetty.xmlcontext.xml. 。另外,我发现它使用起来更干净 jetty.confjetty.sh 用于传递 JVM 参数、自定义 XML 以及启动和停止。

希望这可以帮助。


热部署时:

现在,如果您使用 Maven 并使用嵌入式 Jetty。它只知道代码何时更改——就像“枪声嗅探器”一样。在 dev envt 中,您运行 Jetty,进行更改,刷新页面,然后查看您的更改 -- 热部署. 。在这里找到更多 http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin 寻找 scanIntervalSeconds

其他提示

这并没有完全回答你的问题,但如果它有帮助,这里使用嵌入式码头7的一些非常最小的代码,以触发一个根sterllet的服务器:

    HandlerCollection handlers = new HandlerCollection();
    ServletContextHandler root = new ServletContextHandler(handlers, "/", ServletContextHandler.NO_SESSIONS|ServletContextHandler.NO_SECURITY);
    root.addServlet(new ServletHolder(new MyServlet()), "/*");

    Server server = new Server(8080);
    server.setHandler(handlers);
    server.start();
.

参见当然 http://wiki.eclipse.org/jetty/tutorial/embedding_jetty

如果您使用maven(IDE独立)建造,那么您应该使用Maven Jetty插件调试。基本上,您将应用程序作为“mvn jetty:运行”在命令行上,它只是有效,而无需进行任何重新部署。最良好的ides如何构建Maven支持,让您将应用程序运行/调试为Maven;意思是maven正在运行,它启动了启动应用程序的码头插件,您可以调试它。由于一切都在IDE源和BIN文件夹中耗尽,因此您甚至不需要码头服务器安装。

这是一个demo项目,它以这种方式 https ://github.com/simbo1905/zktodo2/blob/master/commandline.build.and.run.txt 此处是如何在eclipse https://github.com/simbo1905/zktodo2/blob/master/eclipse.indigo.build.and. debug.txt ,但任何了解Maven的IDE都应该工作。看看pom.xml,它设置了maven jetty插件。

我将使用Gradle并每隔几秒钟扫描构建输出文件夹以进行构建的更改。

在build.gradle文件中:

apply plugin: 'jetty'

...

jettyRun.doFirst {
    // set system properties, etc here for bootstrapping
}

jettyRun {
    httpPort = 8989
    reload = 'automatic'
    scanIntervalSeconds = 3
    daemon = false
}
.

就是这样。您可以选择为您提供IDE自动构建,并指向该目录。但你也可以选择不。此解决方案根本没有绑定到IDE。

我以为我现在更新我现在所做的事情。我写了一个小型命令行App / Maven Archetype,就像我认为这一切都应该首先工作。Bootstrap应用程序允许您通过将其传递到战争和港口的路径来启动您的Servlet容器(Jetty,Tomcat,GlassFish)。

使用maven,您可以创建和包装自己的这个简单应用程序的实例:

mvn archetype:generate \
    -DarchetypeGroupId=org.duelengine \
    -DarchetypeArtifactId=war-bootstrap-archetype \
    -DarchetypeVersion=0.2.1
.

然后您将其推出如下:

java -jar bootstrap.jar -war myapp.war -p 8080 --jetty
.

这是实用程序和原型的源: https://bitbucket.org/mckamey/war-bootstrap

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top