最干净的Jetty配置开发?

时间:2011-02-11 19:34:59

标签: servlets jetty war embedded-jetty xml-configuration

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

我正在尝试简化写代码的开发迭代周期>>构建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 Using only command line

指定这个WAR位置和服务它的主机/端口所需的最小XML是什么?

提前感谢任何代码段或链接。

5 个答案:

答案 0 :(得分:4)

Jetty已迁移到Eclipse。这里有非常微妙的信息。这也导致了包名称的变化,这是另一个细微差别。他们确实发布了一个工具来将Jetty6设置转换为Jetty 7设置,但是再次 - 不是很受欢迎。我对Eclipse Jetty论坛感到失望。在这里您应该在Jetty 7之后查找文档http://wiki.eclipse.org/Jetty/Starting

我认为这是从http://wiki.eclipse.org/Jetty/Reference/jetty.xml

取得的最小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)How to serve webbapp A from portA and webapp B from portB

另请参阅以下页面:

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


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

开发

我们使用Maven,因此嵌入Jetty为我们工作。我们只运行mvn clean install run:jetty,并在Maven的配置文件中配置端口,即pom.xml。这是 IDE依赖加Jetty可以使用ANT轻松嵌入,但我从未尝试过。

测试

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

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

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

PROD

Prod与测试程序几乎相同,除了。调整是为了更高的安全性和负载平衡。但是从部署POV开始,测试用例与Prod没有什么不同。

请注意,我并不关心XML文件是什么以及必须存在多少XML文件。我刚刚使用了我关注的问题 - jetty.xmlcontext.xml。另外,我发现使用jetty.confjetty.sh传递JVM参数,自定义XML以及启动和停止更加清晰。

希望这有帮助。


热门部署:

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

如果您使用maven构建(与IDE无关),那么您应该使用maven jetty插件进行调试。基本上你在命令行上运行应用程序为“mvn jetty:run”它只需工作而无需进行任何重新部署。大多数优秀的IDE如何内置maven支持,并允许您作为maven运行/调试应用程序;意思是maven运行启动jetty插件启动应用程序,你可以调试它。由于IDE源文件夹和bin文件夹的所有内容都已耗尽,因此您甚至不需要安装Jetty服务器。

这是一个以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都应该可以运行。看看它设置maven jetty插件的pom.xml。

答案 4 :(得分: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无关。

相关问题