2016-07-13 2 views
0

Я пытаюсь понять, как мы должны настраивать веб-приложение. Теперь у меня есть простой Gradle проект со встроенным причаломМестоположение Java web.xml и пристань

layout structure

Зависимости:

dependencies { 
    compile('org.eclipse.jetty:jetty-servlet:9.3.10.v20160621') 
    compile('org.eclipse.jetty:jetty-webapp:9.3.10.v20160621') 

    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

Применения основное:

package test; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.webapp.WebAppContext; 

public class App { 
    public static void main(String[] args) throws Exception { 

     System.out.println(">> Running"); 
     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setDescriptor("src/main/resources/WEB-INF/web.xml"); 
     webAppContext.setResourceBase("/"); 
     webAppContext.setContextPath("/"); 

     Server server = new Server(8080); 
     server.setHandler(webAppContext); 
     server.start(); 
     server.join(); 
    } 
} 

В web.xml я определил только реализацию контекста сервлета найти если он был схвачен с приложением.

Моя проблема: webAppContext.setDescriptor("src/main/resources/WEB-INF/web.xml") Jetty может найти web.xml только с этим странным путем.

Зачем мне нужно указывать его из папки проекта? Если я запускаю задачу jar с помощью gradle, это не будет какой-либо каталог src внутри jar.

Есть способ сделать что-то вроде: App.class.getResource("/WEB-INF/web.xml") и загрузить web.xml, связанные с classpath?

ответ

0

Кажется, это был вопрос о загрузчиках некоторых классов.

После некоторых дальнейших поисков я заканчивался следующим раствором:

public class App { 
    private static final String WEBAPP_RESOURCES_LOCATION = "webapp"; 

    public static void main(String[] args) throws Exception { 
     System.out.println(">> Running"); 

     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setContextPath("/"); 

     URL webAppDir = Thread.currentThread().getContextClassLoader().getResource(WEBAPP_RESOURCES_LOCATION); 
     webAppContext.setResourceBase(webAppDir.toURI().toString()); 

     // if setDescriptor set null or don't used jetty looking for /WEB-INF/web.xml under resource base 
//  webAppContext.setDescriptor(webAppDir.toURI().toString() + "web.xml"); 

     Server server = new Server(8080); 
     server.setHandler(webAppContext); 
     server.start(); 
     server.join(); 
    } 
} 

An раскладка:

enter image description here

Благодаря GitHub Арей пользователя для нелогич- examle

0

вашего web.xml должно быть в

src/main/webapp/WEB-INF 

UPD: извините, нажал submit перед тем, как доработать сообщение.

выше работает для меня, и тогда я могу запустить тест, как:

Server server; //jetty server 

private static Integer portNum = 9999; 
private static String ENDPOINT_URL = "http://localhost:" + portNum + "/appName/"; 

@Before 
public void startJetty() throws Exception{ 
    server = new Server(portNum); 
    server.setStopAtShutdown(true); 
    WebAppContext webAppContext = new WebAppContext(); 
    webAppContext.setContextPath("/appName"); 
    webAppContext.setResourceBase("src/main/webapp");  
    webAppContext.setClassLoader(getClass().getClassLoader()); 
    server.setHandler(webAppContext); 
    server.start(); 
} 

@After 
public void stopJetty(){ 
    try { 
     server.stop(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Test 
public void serverNotNull(){ 
    assertNotNull("jetty must be initialised", server); 
}