2013-02-28 19 views
6

Yerleşik bir Jetty Server'a bir web uygulaması dağıtmaya çalışıyorum. Uygulamam, aşağıdaki kodla birlikte bir Windows ortamında yerel olarak çalışıyor ancak bir Linux Sunucusunda bir JAR Dosyası olarak dağıttığımda, web.xml Dosyamın alınmadığı anlaşılıyor. Bir JAR oluşturmadan önce aşağıdaki Tanımlayıcı veya Kaynak Bankası alanlarında değişiklik yapmam gereken bir şey var mı? olarak Jetty gömülüGömülü 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(); 

cevap

2

dağıtın aşağıdaki gibidir:

Ana Class

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> 

kavanoz dosyasıyla aynı klasörde bir WEB_INF klasör oluşturun; gibi WEB_INF içine web.xml kopyalayın:

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

Ben aynı sorunu vardı ve adil bir çözüm bulundu: Bu ince çalışıyordu
koşuyorum "java-jar ..." terminalden ama kökenli zaman Başka bir projeden çıkar, web.xml alınmadı. Eğer kaynak kullanmazsanız

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

Eğer sadece src içindeki düzenli dosyasını okuyun:

Nedeni ben yapıyor sonuna kadar, ne özgün projeye akrabası, web.xml yolu yanlıştı oldu klasör, sınıf yolunda kaynak bulabilirsiniz ben WebAppContext ve spesifik soyundan olan WebXmlConfiguration yerini .jar

4

için iyi çalışır https://github.com/jreznot/diy-remote/blob/master/server/src/org/strangeway/diyremote/server/sys/ClasspathWebXmlConfiguration.java

İşte bunu nasıl olduğunu.

Önce, pom.xml'Bu, Webapp klasörü nerede beyan ederim: Burada

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

benim src/ana dizinin ağacıdır:

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

yılında Maven Gölge eklentisi ekle senin pom.xml dosyası: böyle

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

Jetty başlatın:

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

Önemli olan, kavanoz içindeki dosyalara yol verecek <YourApp>.class.getResource(<your location>) kullanmaktır. Yanlış bir şekilde bunu yapmak: Dosya sisteminde yolunu veren webContext.setDescriptor("WEB-INF/web.xml");.

Sonra paket

$mvn clean package 

uber-kavanoz dosyası oluşturulur ve kaynak olarak ilan edildi Webapp dizini içerir oluşturun.

yerde veya üretim sunucusunda kavanoz Taşı ve bunun gibi çalıştırmak

:

$ java -jar myjettyembededwithwebxmlandhtmljspfile.jar