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

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

场景是这样的:我有一个webapp,我想用tomcatmaven插件动态运行它。问题是我有许多类路径资源,它们需要在打包工件和从本地工作站运行的工件之间有所不同

失败的尝试:

1.)我的第一次尝试是使用builder helper maven插件,但它不起作用,因为目标配置文件将(不一致地!)进入打包的WAR归档文件

<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>