2013-02-28 10 views
6

Próbuję wdrożyć aplikację internetową na osadzonym serwerze Jetty. Moja aplikacja działa dobrze lokalnie w środowisku Windows z kodem poniżej, ale kiedy wdrażam go jako plik JAR na serwerze Linux, wygląda na to, że mój plik web.xml nie został pobrany. Czy jest coś, co muszę zmienić w polach Descriptor lub ResourceBase poniżej, zanim skonstruuję JAR?Embedded Jetty Server Classpath Issue

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(); 

Odpowiedz

2

Deploy osadzone Jetty następująco:

głównej klasy

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> 

Tworzenie WEB_INF folder w tym samym folderze co plik jar; skopiować web.xml do WEB_INF, takich jak:

sim/light.jar 
sim/WEB-INF/web.xml 
6

miałem ten sam problem i po prostu znaleźć rozwiązanie:
To działa dobrze, kiedy uruchomiony „java -jar ...” z terminala, ale kiedy zrodził to z innego projektu, web.xml nie został odebrany.

Powód był ścieżka web.xml było źle, to w stosunku do pierwotnego projektu, co mam w końcu robi się:

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

Jeśli nie używać zasobu po prostu czytać zwykły plik wewnątrz src Folder, a nie jeden wewnątrz .jar

0
+1

linki wydają się być uszkodzony. –

+1

Linki zostały naprawione – jreznot

4

Oto jak to zrobić.

Po pierwsze, w pom.xml, deklarują, gdzie folderu webapp jest:

<build> 
    <resources> 
     <resource> 
      <directory>src/main</directory> 
     </resource> 
    </resources> 

Oto drzewo mojego katalogu 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 

Dodaj Maven plugin cieniu swojej pom.xml plik:

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

Potem zacznij Jetty tak:

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

Ważną częścią jest użycie <YourApp>.class.getResource(<your location>), która poda ścieżkę do plików wewnątrz słoika. Błędnym sposobem byłoby zrobienie tego w ten sposób: webContext.setDescriptor("WEB-INF/web.xml");, która podaje ścieżkę do systemu plików.

Następnie należy utworzyć pakiet

$mvn clean package 

Plik uber-jar jest generowany i zawiera katalog webapp, który został zadeklarowany jako zasób.

Przesuń słoik gdziekolwiek lub na serwerze produkcyjnym i uruchomić go tak:

$ java -jar myjettyembededwithwebxmlandhtmljspfile.jar