Java 使用Maven在Tomcat中动态运行WAR,如何添加类路径条目以便只有Tomcat才能看到它们?
场景是这样的:我有一个webapp,我想用tomcatmaven插件动态运行它。问题是我有许多类路径资源,它们需要在打包工件和从本地工作站运行的工件之间有所不同 失败的尝试: 1.)我的第一次尝试是使用builder helper maven插件,但它不起作用,因为目标配置文件将(不一致地!)进入打包的WAR归档文件Java 使用Maven在Tomcat中动态运行WAR,如何添加类路径条目以便只有Tomcat才能看到它们?,java,tomcat,maven-2,Java,Tomcat,Maven 2,场景是这样的:我有一个webapp,我想用tomcatmaven插件动态运行它。问题是我有许多类路径资源,它们需要在打包工件和从本地工作站运行的工件之间有所不同 失败的尝试: 1.)我的第一次尝试是使用builder helper maven插件,但它不起作用,因为目标配置文件将(不一致地!)进入打包的WAR归档文件 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>bu
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${testEnv}</directory>
<targetPath>${basedir}/target/classes</targetPath>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
我不知道下一步该做什么。问题的核心似乎是这个插件中缺少了类似Surefire的
元素
下一步是创建自定义catalina.properties并将其添加到
?如果是这样,catalina.properties需要什么样的外观
编辑:下面是更详细的解释
我理解这个问题读起来有点含糊不清,所以我将尝试详细阐述一下
My POM使用WAR插件的webResources功能复制一些特定于环境的配置文件,而不使用配置文件,方法是在名为/src/main/resources env/${env}
的资源中进行复制,如下所示:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
...
<configuration>
...
<webResources>
<!-- Copy Environment-specific resources to classes -->
<resource>
<directory>${basedir}/src/main/resources-env/${env}</directory>
<targetPath>WEB-INF/classes</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
。。。
org.apache.maven.plugins
maven战争插件
...
...
${basedir}/src/main/resources-env/${env}
WEB-INF/课程
这将把(默认的,DEV)环境资源复制到包中,并且目前可以正常工作。还要注意的是,b/c这些都是打包的一部分,tomcat:run目标对他们来说从来都不是秘密的(这是需要的,因为环境不同)
所以问题在于:当执行动态的tomcat:run
时,应用程序将失败,因为它的类路径(它查看target/classes
)将缺少所需的本地工作站环境配置文件。我所需要做的就是让它们进入tomcat的路径,但是如果有人使用mvn包
而不首先清理,我希望这样做,而不向命令行添加任何内容,也不破坏构建的完整性
我希望这更清楚。我可能遗漏了一些东西,但是为什么不在配置文件中声明所需的依赖项,并在运行Tomcat时使用此配置文件呢?我不明白为什么需要将这些资源放在Tomcat的类路径级别 更新:我正在编辑我的答案,以涵盖OP本身回答我上述问题的评论
没错,这些文件确实需要在webapp类路径中,而不是tomcat的。那么,我怎样才能创建一个配置文件来自动激活tomcat:run,但没有额外的cmd行参数呢
我不知道如何在不将概要文件声明为
的情况下执行此操作(这只是一种方法,在路径中使用类似src/main/resources/${env}
的属性是另一种方法)。但这并不能解决所有的问题(比如不指定额外的命令行参数或自动清理目标目录)。我没有任何解决方案。将dependencies元素直接添加到plugin元素
下面是一个使用Maven手册(仍在开发中)中的Jetty插件执行相同操作的示例:这是我目前的解决方案
特别感谢Pascal在这里的勤奋对话,但我最终决定改变在整个目标中加载特定于环境的配置文件的方式,现在我相信我得到了最初想要的大部分内容
我从WAR插件中删除了配置文件,并从
中删除了测试配置文件,现在我使用maven resources插件手动管理资源复制,以便在需要的目标处将它们直接复制到target/class
。通过这种方式,Tomcat可以查看配置,但测试不会因为路径上有重复或不同的配置文件而中断
这肯定是一团糟,但它能起作用。清单:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<id>copy-env-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${env}</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-testEnv-resources</id>
<phase>process-test-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${testEnv}</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-env-resources-again</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${env}</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven资源插件
2.4.1
复制环境资源
过程资源
复制资源
${basedir}/src/main/resources-env/${env}
符合事实的
${basedir}/target/classes
复制测试资源
过程测试资源
复制资源
${basedir}/src/main/resources env/${testEnv}
符合事实的
${basedir}/target/classes
再次复制环境资源
准备包装
复制资源
${basedir}/src/main/resources-env/${env}
符合事实的
${basedir}/target/classes
因此,mvnclean安装
将适当地使用${env}和${testEnv}进行构建和测试。一个mvn-Denv=someLocalConfig tomcat:run
(在我的例子中,它与默认的${testEnv}相同)将确保为tomcat的动态执行加载src/main/resources env/someLocalConfig
,但无需在成功重建之前进行清理
就像我说的,我将同一个文件集群重写到同一个targ,这很混乱
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<id>copy-env-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${env}</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-testEnv-resources</id>
<phase>process-test-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${testEnv}</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-env-resources-again</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${basedir}/src/main/resources-env/${env}</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${basedir}/target/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>