嵌入式Jetty服务器类路径问题

时间:2013-02-28 15:35:24

标签: web.xml embedded-jetty

我试图在嵌入式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(); 

4 个答案:

答案 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();
}

的web.xml

<!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)