在 运行 期间更新 eclipse 中的嵌入式码头 webapp
updating embedded jetty webapp in eclipse during run
我们有一个 maven 生成的 web 应用程序,它运行在一个嵌入式码头服务器中,所有这些都被塞进一个胖罐子里。
这似乎工作正常,但我们的 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 复制到它在 target 中的位置,然后从那里执行。我认为他想要的是让 eclipse 使用 src 文件夹中的 webapp 源,并且只在打包部署时将 webapp 复制过来。
设置它以预期方式工作的最佳方法是什么?
我不确定这是 Maven POM 问题。不就是为了包装吗?
您的资源库使用什么? WebAppContext 的 setResourceBase 需要设置为 web 应用程序的根目录。
您有一个拆分资源方案。
传统上,WebApp 有 1 个去处,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 路径 或 基础资源。但是,您正在编辑 src/main/webapp/
目录中的文件(实际路径由 maven-war-plugin 的 ${warSourceDirectory}
定义),它不是 Base Resource[= 的一部分46=]目录。
你需要做的是忽略${webappDirectory}
中的静态内容,将${warSourceDirectory}
中的静态内容用于WebAppContext.setBaseResource()
,并使用类 ] 和来自 ${baseResource}/WEB-INF/classes
和 ${baseResource}/WEB-INF/lib
外部的 jars(maven 依赖项)
一般技术:
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");
}
对于由 Eclipse Jetty 项目团队维护的 live version of this behavior, see the embedded-jetty-live-war example project。
我们有一个 maven 生成的 web 应用程序,它运行在一个嵌入式码头服务器中,所有这些都被塞进一个胖罐子里。 这似乎工作正常,但我们的 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 复制到它在 target 中的位置,然后从那里执行。我认为他想要的是让 eclipse 使用 src 文件夹中的 webapp 源,并且只在打包部署时将 webapp 复制过来。
设置它以预期方式工作的最佳方法是什么?
我不确定这是 Maven POM 问题。不就是为了包装吗?
您的资源库使用什么? WebAppContext 的 setResourceBase 需要设置为 web 应用程序的根目录。
您有一个拆分资源方案。
传统上,WebApp 有 1 个去处,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 路径 或 基础资源。但是,您正在编辑 src/main/webapp/
目录中的文件(实际路径由 maven-war-plugin 的 ${warSourceDirectory}
定义),它不是 Base Resource[= 的一部分46=]目录。
你需要做的是忽略${webappDirectory}
中的静态内容,将${warSourceDirectory}
中的静态内容用于WebAppContext.setBaseResource()
,并使用类 ] 和来自 ${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");
}
对于由 Eclipse Jetty 项目团队维护的 live version of this behavior, see the embedded-jetty-live-war example project。