使用Maven在Tomcat中动态运行WAR,如何添加类路径条目以便只有Tomcat才能看到它们?

场景是这样的:我有一个webapp,我想用tomcat-maven-plugin的tomcat:run goal动态运行 。 皱纹是我有许多类路径资源需要在打包的工件和运行本地工作站之间有所不同。

尝试失败:

1.)我的第一次尝试是使用builder-helper-maven-plugin,但是它不起作用,因为目标配置文件将(不一致!)以他们的方式进入打包的WAR存档。

 org.codehaus.mojo build-helper-maven-plugin 1.3   add-resource generate-resources  add-resource     ${basedir}/src/main/resources-env/${testEnv} ${basedir}/target/classes       

2.)我的第二次尝试是将文件夹(因为要部署的文件在Tomcat的类路径中不存在)添加到-Djava.ext.dirs,但它没有效果(我实际上怀疑这个systemProperties元素配置错误或根本不起作用。 看到:

  org.codehaus.mojo tomcat-maven-plugin 1.0-beta-1  ${basedir}/src/main/mock/web.xml   java.ext.dirs ${basedir}/src/main/resources-env/${testEnv}   /licensing   

我不确定下一步该尝试什么。 问题的核心似乎是这个插件中缺少的东西就像Surefire的元素。

下一步是创建自定义catalina.properties并将其添加到吗? 如果是这样,catalina.properties需要看起来像什么?

编辑:更详尽的说明如下

我理解这个问题有些模糊,所以我会试着详细说明一下。

我的POM使用WAR插件的webResourcesfunction复制一些特定于环境的配置文件,而不使用配置文件来执行此操作,方法是复制名为/src/main/resources-env/${env}如下所示:

 ...  org.apache.maven.plugins maven-war-plugin ...  ...    ${basedir}/src/main/resources-env/${env} WEB-INF/classes     

这会将(默认的,DEV)环境资源复制到包中,目前工作正常。 另请注意,b / c这些是作为打包的一部分发生的, tomcat:run目标永远不会告诉他们(由于环境不同,这是期望的)。

所以问题是这样的:当执行动态tomcat:run ,应用程序将失败,因为它的类路径(它看起来是target/classes )将缺少所需的本地工作站环境配置文件。 我需要做的就是在tomcat的路径上获取它们,但是如果没有向命令行添加任何内容,并且如果有人跟进mvn package并且不首先clean ,那么肯定不会破坏构建的完整性。

我希望这更清楚。

我可能会遗漏一些东西,但为什么不在配置文件中声明所需的依赖项并在运行Tomcat时使用此配置文件? 我不明白为什么你需要将这些资源放在Tomcat的类路径级别。

更新:我正在编辑我的答案以涵盖OP本身回答上述问题的评论。

你是对的,文件确实需要在webapp类路径中,而不是tomcat。 那么我怎样才能创建一个为tomcat自动激活的配置文件:运行但没有额外的cmd线args?

如果不将配置文件声明为或将其列在下,我不知道如何做到这一点(但这不是我想到的,我宁愿使用属性激活并调用类似mvn tomcat:run -Denv=test东西mvn tomcat:run -Denv=test ,不确定为什么这是一个问题)。

我应该如何在配置文件中“声明依赖项”,同时确保后续调用永远不会让它们通过vanilla mvn包进入包WAR

如果前面提到的配置文件默认处于活动状态,那么你需要通过调用类似mvn package -P !profile-1类的东西来排除它。 对于一个特定目标,不能神奇地停用配置文件(至少,据我所知)。

实际上,我的理解是你在这里确实有两个不同的上下文:“测试”上下文(你想在WAR中包含更多内容)和“普通”上下文(你不希望包含这些内容) 。 说实话,我不知道如何在不指定任何其他参数的情况下区分这两种情况(根据上下文激活配置文件或停用它)。 你必须有正当理由,但正如我所说,我真的不明白为什么这是一个问题。 因此,配置文件可能不适合您的情况。 但我真的很想理解为什么,因为这似乎是配置文件的典型用例:)

更新2:读完你对另一个答案和你的更新的评论,我意识到我最初的理解是错误的(我虽然你在谈论maven意义上的依赖)。 但是,我仍然认为配置文件可以帮助您,例如在此博客文章中自定义 (这只是一种方法,在路径中使用src/main/resources/${env}等属性是另一种方式)。 但这并不能解决您的所有问题(例如不指定其他命令行参数或自动清理目标目录)。 我没有任何解决方案。

将dependencies元素直接添加到插件元素。

下面是一个使用Jetty插件的例子(仍在开发中)Maven手册: http : //www.sonatype.com/books/mhandbook-stage/reference/ch06s03.html

投票支持http://jira.codehaus.org/browse/MTOMCAT-77 ,以满足这一需求。

这是我现在的解决方案。

特别感谢Pascal在这里的勤奋对话,但我最终决定改变我在整个目标中加载环境特定配置文件的方式,现在我相信我已经得到了我最初想要的大部分内容。

我从WAR插件中删除了的配置文件,从了测试配置,现在我手动使用maven-resources-plugin管理资源复制,将它们直接复制到target/classes中需要的。 这样Tomcat就可以看到配置,但是测试不会因路径上有重复或不同的配置文件而中断。

这绝对是一团糟,但它确实有效。 清单:

  org.apache.maven.plugins maven-resources-plugin 2.4.1   copy-env-resources process-resources  copy-resources     ${basedir}/src/main/resources-env/${env} true   ${basedir}/target/classes    copy-testEnv-resources process-test-resources  copy-resources     ${basedir}/src/main/resources-env/${testEnv} true   ${basedir}/target/classes    copy-env-resources-again prepare-package  copy-resources     ${basedir}/src/main/resources-env/${env} true   ${basedir}/target/classes     

因此, mvn clean install将使用$ {env}和$ {testEnv}进行适当的构建和测试。 一个mvn -Denv=someLocalConfig tomcat:run (在我的情况下与我的默认$ {testEnv}相同)将确保为Tomcat的动态执行加载src/main/resources-env/someLocalConfig ,但不要求我执行在成功重建之前清理。

就像我说的那样,我在每个阶段将同一个文件集重写到同一个目标位置,但它完成了我的意思。