我们有一个maven生成的webapp,它运行在嵌入式Jetty服务器中,所有这些都塞进了胖罐子里。 这似乎工作正常,但我们的UI开发人员不高兴,因为在做他的UI东西时,他想要更改他的代码,而不必重新启动webapp让它显示出来。在我做了所有的jar之前,它就像那样工作。 我们在pom中有一个资源部分,如下所示:
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/webapp</directory>
<targetPath>webapp</targetPath>
</resource>
</resources>
我们已经确定了似乎正在发生的事情是eclipse正在将webapp复制到其在目标中的位置,然后从那里执行。我想,他想要的是让eclipse使用src文件夹中的webapp源,并且只在打包部署时复制webapp。
将此设置为以预期方式工作的最佳方法是什么?
答案 0 :(得分:2)
您有一个拆分资源方案。
传统上,WebApp有一个地方,即webapp资源库(Jetty中的WebAppContext.setBaseResource()
)。这是从中加载所有静态内容WEB-INF
元数据(xml),WEB-INF/classes
和WEB-INF/lib/*.jar
文件的位置。
在您的方案中,您要从target/mywebapp-1.0-SNAPSHOT
(由maven-war-plugin ${webappDirectory}
定义的实际路径)加载所有内容
这是生产容量WebAppContext
的典型和正常行为,因为它配置为使用简单的 War path 或 Base Resource 。但是,您正在编辑src/main/webapp/
目录中的文件(由maven-war-plugin的${warSourceDirectory}
定义的实际路径),该文件不是 Base Resource 目录的一部分。
您需要做的是忽略${webappDirectory}
中的静态内容,并使用${warSourceDirectory}
中的静态内容用于WebAppContext.setBaseResource()
,并使用类和jar(maven依赖项) )来自${baseResource}/WEB-INF/classes
和${baseResource}/WEB-INF/lib
一般技术:
WebAppContext context = new WebAppContext();
context.setContextPath("/");
switch (getOperationalMode())
{
case PROD:
// Configure as WAR
context.setWar(basePath.toString());
break;
case DEV:
// Configuring from Development Base
context.setBaseResource(new PathResource(basePath.resolve("src/main/webapp")));
// Add webapp compiled classes & resources (copied into place from src/main/resources)
Path classesPath = basePath.resolve("target/thewebapp/WEB-INF/classes");
context.setExtraClasspath(classesPath.toAbsolutePath().toString());
break;
default:
throw new FileNotFoundException("Unable to configure WebAppContext base resource undefined");
}
对于live version of this behavior,请参阅Eclipse Jetty项目团队维护的embedded-jetty-live-war example project。
答案 1 :(得分:1)
我不确定这是Maven POM问题。这不仅仅是为了包装吗?
您使用的资源库是什么? WebAppContext的setResourceBase需要设置为Web应用程序的根目录。