这是一个简单的问题:是否可以从其他项目启动带有嵌入式码头的web-app? 我正在尝试运行(使用JUnit)以下代码:
Server server = new Server(80);
WebAppContext context = new WebAppContext();
File webXml = new File("../Project1/src/main/webapp/WEB-INF/web.xml");
context.setDescriptor(webXml.getAbsolutePath());
context.setResourceBase("../Project1/src/main/webapp");
context.setContextPath("/");
context.setParentLoaderPriority(false);
server.setHandler(context);
server.start();
如果我从另一个项目执行此操作,让我们说Project2,jetty抛出了很多例外: javax.servlet.UnavailableException:com.sun.xml.ws.transport.http.servlet.WSSpringServlet java.lang.ClassNotFoundException:com.sun.xml.ws.transport.http.servlet.WSSpringServlet
我已经尝试将Project1添加到Project的2类路径中,但这对情况没有帮助。 如果我尝试在相同的Project1中运行相同的(当然,调整了所有路径) - 一切正常。
感谢您的帮助。
答案 0 :(得分:0)
这可能是由于相对路径字符串造成的。
这是使用JUnit Assert的替代方法......
Server server = new Server(80);
WebAppContext context = new WebAppContext();
File otherProject = new File("../Project1");
Assert.assertTrue("Project1 should exist", otherProject.exists());
// make path reference canonical (eliminate the relative path reference)
otherProject = otherProject.getCanonicalFile();
File webAppDir = new File(otherProject, "src/main/webapp");
Assert.assertTrue("Webapp dir should exist", webAppDir.exists());
File webXml = new File(webAppDir, "WEB-INF/web.xml");
Assert.assertTrue("web.xml should exist", webXml.exists());
context.setDescriptor(webXml.getAbsolutePath());
context.setResourceBase(webAppDir.getAbsolutePath());
context.setContextPath("/");
context.setParentLoaderPriority(false);
server.setHandler(context);
server.start();
或者这可能是因为../Project1/src/main/webapp/WEB-INF/lib
没有您需要的依赖项。这很重要,因为WebAppContext将首先使用提供的WEB-INF/lib
内容,然后使用服务器类路径。
答案 1 :(得分:0)
所以我得到了解决方案,
您要么将原始的webapp项目包含为依赖项,要么使用自定义类加载器(如果不可能):
WebAppClassLoader customLoader = new WebAppClassLoader(context);
customLoader.addClassPath("../Project1/target/webapp/WEB-INF/classes");
Resource jars = Resource.newResource("../Project1/target/webapp/WEB-INF/lib");
customLoader.addJars(jars);
webapp.setClassLoader(customLoader);