Java web.xml 嵌入码头的位置
Java web.xml location for embedded jetty
我正在尝试了解我们应该配置 Web 应用程序的方式。
现在我有一个带有嵌入式码头的简单 gradle 项目
依赖关系:
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 中,我只定义了 ServletContextListener 实现以查看它是否被应用程序捕获。
我的问题是:webAppContext.setDescriptor("src/main/resources/WEB-INF/web.xml")
Jetty 只能通过这个奇怪的位置路径找到 web.xml。
为什么我需要从项目文件夹中定位它?
如果我使用 gradle 运行 jar 任务,则 jar 中不会有任何 src 目录。
是否存在这样的方法:App.class.getResource("/WEB-INF/web.xml")
并加载与类路径相关的 web.xml?
似乎是一些 class 加载器问题。
经过进一步搜索后,我得出了下一个解决方案:
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();
}
}
布局:
感谢 github 用户 arey 的考试 examle
你的 web.xml 应该在
src/main/webapp/WEB-INF
UPD:抱歉,在完成 post 之前按下了提交。
以上对我有用,然后我可以 运行 像这样的测试:
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);
}
我正在尝试了解我们应该配置 Web 应用程序的方式。 现在我有一个带有嵌入式码头的简单 gradle 项目
依赖关系:
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 中,我只定义了 ServletContextListener 实现以查看它是否被应用程序捕获。
我的问题是:webAppContext.setDescriptor("src/main/resources/WEB-INF/web.xml")
Jetty 只能通过这个奇怪的位置路径找到 web.xml。
为什么我需要从项目文件夹中定位它? 如果我使用 gradle 运行 jar 任务,则 jar 中不会有任何 src 目录。
是否存在这样的方法:App.class.getResource("/WEB-INF/web.xml")
并加载与类路径相关的 web.xml?
似乎是一些 class 加载器问题。
经过进一步搜索后,我得出了下一个解决方案:
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();
}
}
布局:
感谢 github 用户 arey 的考试 examle
你的 web.xml 应该在
src/main/webapp/WEB-INF
UPD:抱歉,在完成 post 之前按下了提交。
以上对我有用,然后我可以 运行 像这样的测试:
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);
}