Servlets 开发用最清洁的码头配置?

Servlets 开发用最清洁的码头配置?,servlets,jetty,war,embedded-jetty,xml-configuration,Servlets,Jetty,War,Embedded Jetty,Xml Configuration,编辑:我想我应该澄清我的意图 我试图简化编写代码>>构建战争>>部署>>刷新>>重复的开发迭代周期。我希望相对独立于IDE(也就是说,我不希望Eclipse或IntelliJ插件完成这项工作)。我希望能够编辑代码/静态文件,并根据需要构建到我的WAR源代码目录中,只需将运行/调试安装程序作为对集中式Jetty安装的命令行调用 稍后,我希望能够使用大致相同的设置执行实际部署,但使用打包的WAR。我不想让我的应用程序代码特定于我的IDE或Jetty 因此,问这个问题的更好方法是您发现使用Jetty作

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

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

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

因此,问这个问题的更好方法是您发现使用Jetty作为开发/调试应用程序服务器的最干净方法是什么?


假设我想要一个最小的Jetty 7安装。我想要尽可能少的XML配置,我只需要原始的ServletAPI,没有JSP,没有过滤,等等。我只想能够有一些定制的Servlet,如果存在静态文件,就可以提供静态文件。这将是唯一的战争,它将作为一个特定港口的根源

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

我发现文档到处都是,其中大部分是针对Jetty 6的,或者是针对各种其他包(Spring等)的。我想如果我把这个最小的配置放在下面,那么在上面添加额外的抽象会更干净。此外,它将允许我更清晰地处理嵌入式码头场景

这个问题是一个示例场景,该XML将非常有用

指定这一战争地点以及为其提供服务的主机/端口所需的最小XML是什么?


提前感谢您提供的任何代码片段或链接。

这并不能完全回答您的问题,但如果有帮助,下面是一些使用嵌入式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();

当然可以。Jetty已经迁移到Eclipse。这方面有非常微妙的信息。这也导致了包名的变化,这是另一个细微差别。他们确实发布了一个util来将Jetty6设置转换为jetty7设置,但同样——不是很流行。我对Eclipse Jetty论坛感到失望。这里是您应该查找Jetty 7以后的文档的地方

我认为这是从

否则,我将按照这里解释的方式修改
context.xml
(对于Jetty 7)

另请参阅以下页面:

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


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

发展

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

试验

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

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

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

刺激

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

请注意,我并不关心什么是XML文件以及必须有多少XML文件。我刚刚使用了我关心的问题--
jetty.xml
context.xml
。另外,我发现使用
jetty.conf
jetty.sh
传递JVM参数、自定义XML以及启动和停止要干净得多

希望这有帮助


关于热部署:


现在,如果您使用Maven和嵌入式Jetty。它只知道代码什么时候被更改——比如“枪声嗅探器”。在devenvt中,您可以运行Jetty,进行更改,刷新页面,并查看您的更改--热部署。在这里查找更多信息查找
扫描间隔秒

我想我应该用我现在所做的更新。我已经编写了一个小小的命令行app/Maven原型,它的工作原理与我最初的想法类似。bootstrap应用程序只需将路径传递给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

下面是实用程序和原型的源代码:

如果您使用maven(独立于IDE)进行构建,那么您应该使用maven jetty插件进行调试。基本上,您可以在命令行上以“mvn jetty:run”的形式运行应用程序,而无需进行任何重新部署。大多数优秀的IDE都内置了maven支持,并允许您作为maven运行/调试应用程序;这意味着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
apply plugin: 'jetty'

...

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

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