6

我正在尝试在嵌入式 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

4 回答 4

6

我遇到了同样的问题,刚刚找到了解决方案:
当我从终端运行“java -jar ...”时它工作正常,但是当我从另一个项目中生成它时,web.xml 没有被拾取。

原因是 web.xml 路径错误,它与原始项目相关,我最终做的是:

context.setDescriptor(Launch.class.getResource("/WEB-INF/web.xml").toString());

如果您不使用资源,您只需阅读 src 文件夹中的常规文件,而不是 .jar 中的文件

于 2013-05-13T18:07:05.387 回答
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
于 2014-09-08T11:34:54.293 回答
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>   

WEB_INF在与jar文件相同的文件夹中创建一个文件夹;复制web.xmlWEB_INF,如:

sim/light.jar
sim/WEB-INF/web.xml
于 2013-03-07T10:16:05.033 回答