编辑:我想我应该澄清我的意图......
我正在尝试简化写代码的开发迭代周期>>构建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是什么?
提前感谢任何代码段或链接。
答案 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.xml
和context.xml
。另外,我发现使用jetty.conf
和jetty.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();
答案 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无关。