我们的项目设置为打包WAR,这对本地开发非常有用:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<id>package-war</id>
<phase>package</phase>
<goals>
<goal>war</goal>
</goals>
...
此战争中包含应用程序使用的映射器文件和logback文件,该文件位于:src/main/resources/logback.xml
和/src/main/resources/mappers/our-mapper.xml
下。
在构建战争时,这些文件会在our.war/WEB-INF/classes/logback.xml
和our.war/WEB-INF/classes/mappers/our-mapper.xml
当我们打包我们的程序集以进行部署时,我们需要将这些文件从战争中分离出来,我们使用程序集描述符来完成:
<assembly>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files>
<file>
<source>target/${build.finalName}.war</source>
<outputDirectory>${tomcat-instance}/webapps</outputDirectory>
</file>
<file>
<source>src/main/resources/logback.xml</source>
<outputDirectory>${tomcat-instance}/resources/</outputDirectory>
</file>
</files>
<fileSets>
<fileSet>
<directory>src/main/resources/mapper</directory>
<outputDirectory>${tomcat-instance}/resources/mapper/</outputDirectory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
在Maven中配置:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/resources/our-assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
这构造了程序集,但我关注的是logback.xml
和mappers/our-mapper.xml
文件仍包含在war
内的assembly.tar.gz
中。
是否可以保持程序集在外部程序集中包含.xml
文件的配置,但也有内部的战争汇编的.tar.gz
程序集会排除这些相同的文件,因此它们在类路径中不会出现两次?
提前感谢您的帮助。
答案 0 :(得分:2)
您现在可能已经找到了解决此问题的解决方案或解决方法 - 但是,我很想知道这是否可行,因此我创建了一个与您描述的文件结构相同的小型测试项目。
我设法让这个项目构建出两个war文件 - 包含.xml文件的程序集外部的文件,以及不包含.xml文件的程序集内的文件。我通过创建一个额外的程序集来实现这一点,该程序集构建了一个明确排除.xml文件的第二个临时war文件。然后现有的程序集包含这个新的war文件,而不是默认的war。
新程序集war-assembly.xml
如下所示:
<assembly>
<id>temp</id>
<formats>
<format>war</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target/${build.finalName}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>**/*</include>
</includes>
<excludes>
<exclude>**/logback.xml</exclude>
<exclude>**/mapper/*</exclude>
</excludes>
</fileSet>
</fileSets>
</assembly>
然后修改现有的程序集以包含新的war文件:
<assembly>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files>
<file>
<source>target/${build.finalName}-temp.war</source>
<outputDirectory>${tomcat-instance}/webapps</outputDirectory>
<destName>target/${build.finalName}.war</destName>
</file>
<file>
<source>src/main/resources/logback.xml</source>
<outputDirectory>${tomcat-instance}/resources/</outputDirectory>
</file>
</files>
<fileSets>
<fileSet>
<directory>src/main/resources/mapper</directory>
<outputDirectory>${tomcat-instance}/resources/mapper/</outputDirectory>
<includes>
<include>**/*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
然后修改pom.xml
以在现有程序集之前引用新程序集。
<descriptors>
<descriptor>src/main/resources/war-assembly.xml</descriptor>
<descriptor>src/main/resources/our-assembly.xml</descriptor>
</descriptors>
这似乎工作正常。它确实将-temp
war文件放在target
文件夹中,可能会被删除以避免混淆。