我试图在嵌入式Jetty服务器上部署Web应用程序。我的应用程序在Windows环境中使用下面的代码在本地运行良好,但是当我在Linux服务器上将其部署为JAR文件时,看起来我的web.xml文件没有被选中。在构建JAR之前,我是否需要在下面的Descriptor或ResourceBase字段中更改某些内容?
static void startJetty() {
try {
Server server = new Server(9090);
WebAppContext context = new WebAppContext();
context.setDescriptor("/WEB-INF/web.xml");
context.setResourceBase("../DemoWithMultiChannels/src/");
context.setContextPath("/");
context.setParentLoaderPriority(true);
server.setHandler(context);
System.out.println("Starting Server!");
server.start();
答案 0 :(得分:6)
我有同样的问题,只是找到了解决方案:
当我从终端运行“java -jar ...”时工作正常,但是当我从另一个项目中生成它时,web.xml没有被选中。
原因是web.xml路径错误,它与原始项目相关,我最终做的是:
context.setDescriptor(Launch.class.getResource("/WEB-INF/web.xml").toString());
如果您不使用资源,您只需阅读src文件夹中的常规文件,而不是.jar中的常规文件
答案 1 :(得分:4)
以下是如何做到的。
首先,在您的pom.xml中,声明webapp文件夹的位置:
<build>
<resources>
<resource>
<directory>src/main</directory>
</resource>
</resources>
这是我的src / main目录的树:
├── java
│ └── com
│ └── myco
│ └── myapp
│ └── worker
│ ├── App.java
| ...
├── resources
│ ├── log4j.properties
│ └── version.properties
└── webapp
├── index.html
├── index.jsp
├── lib
│ ├── inc_meta.jsp
│ └── inc_navigation.jsp
├── query.html
├── scripts
│ ├── angular.min.js
│ └── bootstrap.min.css
├── showresults.jsp
├── status.jsp
└── WEB-INF
└── web.xml
在pom.xml文件中添加Maven Shade插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>uber-${artifactId}-${version}/finalName>
</configuration>
</plugin>
然后像这样启动Jetty:
public static void startJetty() throws Exception {
logger.info("starting Jetty...");
Server server = new Server(8080);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/");
/* Important: Use getResource */
String webxmlLocation = App.class.getResource("/webapp/WEB-INF/web.xml").toString();
webAppContext.setDescriptor(webxmlLocation);
/* Important: Use getResource */
String resLocation = App.class.getResource("/webapp").toString();
webAppContext.setResourceBase(resLocation);
webAppContext.setParentLoaderPriority(true);
server.setHandler(webAppContext);
server.start();
server.join();
}
重要的是使用<YourApp>.class.getResource(<your location>)
来提供jar中文件的路径。错误的方法是这样做:webContext.setDescriptor("WEB-INF/web.xml");
,它提供了文件系统的路径。
然后创建包
$mvn clean package
生成uber-jar文件,其中包含声明为资源的webapp目录。
将jar移动到生产服务器上的任何位置或运行它,如下所示:
$ java -jar myjettyembededwithwebxmlandhtmljspfile.jar
答案 2 :(得分:2)
按如下方式部署嵌入式Jetty:
public static void main(String[] args) throws Exception {
Server server = new Server(8085);
WebAppContext webContext = new WebAppContext();
webContext.setDescriptor("WEB-INF/web.xml");
webContext.setResourceBase("src/sim/ai/server/start");
webContext.setServer(server);
webContext.setParentLoaderPriority(true);
server.setHandler(webContext);
server.start();
server.join();
}
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>sim.ai.server.start</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>sim.ai.server.start</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
在jar文件所在的文件夹中创建一个WEB_INF
文件夹;将web.xml
复制到WEB_INF
,例如:
sim/light.jar
sim/WEB-INF/web.xml
答案 3 :(得分:0)
我已将WebAppContext和WebXmlConfiguration替换为可在类路径中查找资源的特定后代:
WebXmlConfiguration:https://github.com/jreznot/diy-remote/blob/master/server/src/org/strangeway/diyremote/server/sys/ClasspathWebXmlConfiguration.java
对我有用