2

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

我正在尝试简化编写代码>>构建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 question 是一个示例场景,这个 XML 将很有用Jetty Run War 仅使用命令行

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

提前感谢任何片段或链接。

4

5 回答 5

4

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:对于每个连接器的 webapp 的错误 URL 感到抱歉。我已经更新了如何从 portA 为 webbapp A 和从 portB 提供 webapp B 的链接,以指向适用于 Jetty 7 的文档。


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

开发

我们使用 Maven,因此嵌入式 Jetty 适合我们。我们刚刚运行mvn clean install run:jetty,端口在 Maven 的配置文件中配置,即pom.xml. 这依赖于 IDE,而且可以使用 ANT 轻松嵌入 Jetty,但我从未尝试过。

测试

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

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

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

产品

Prod 的程序与 test 几乎相同,除了。调整是为了更高的安全性和负载平衡。但是从部署 POV 来看,从 Test case 到 Prod 并没有什么不同。

请注意,我没有关心 XML 文件是什么以及必须有多少。我刚刚使用了我关心的那些 -jetty.xmlcontext.xml. 另外,我发现它在使用jetty.confjetty.sh传递 JVM 参数、自定义 XML 以及启动和停止方面要干净得多。

希望这可以帮助。


热部署:

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

于 2011-02-11T20:25:39.223 回答
3

这并不能完全回答您的问题,但如果有帮助,这里有一些非常简单的代码,使用嵌入式 Jetty 7 来启动具有一个根 servlet 的服务器:

    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

于 2011-02-11T19:50:32.863 回答
0

我想我会更新我现在所做的。我已经编写了一个很小的命令行应用程序/Maven 原型,它的工作方式就像我认为这一切首先应该具有的那样。引导应用程序允许您通过将路径传递给 WAR 和您的端口来启动您选择的 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

于 2011-07-27T18:39:00.877 回答
0

如果您使用 maven(独立于 IDE)构建,那么您应该使用 maven jetty 插件进行调试。基本上,您在命令行上将应用程序作为“mvn jetty:run”运行,这一切都可以正常工作,而无需进行任何重新部署。大多数优秀的 IDE 是如何内置 maven 支持并让您将应用程序作为 maven 运行/调试的;这意味着运行 maven 会启动启动应用程序的 jetty 插件,您可以对其进行调试。由于一切都用完了 IDE 源和 bin 文件夹,您甚至不需要安装码头服务器。

这是一个以这种方式运行的演示项目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 插件。

于 2012-06-17T07:17:15.200 回答
0

我会使用 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 完全无关。

于 2013-05-13T22:32:45.280 回答