今天遇到一个变态的需求,一个war工程,要同打出一个war包,还要同时打出一个jar包,jar包里能包含一部分classes文件,并且不能有任何的资源文件。同时要根据不同的环境打包(开发,测试,生产),同时还要保证在myeclipse下同步到tomcat时不能出问题。真是麻烦啊,下面的全部的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gd.app</groupId>
<artifactId>RoadDataCollection</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>RoadDataCollection</name>
<url>http://maven.apache.org</url>
<dependencies>
依赖部分省略
</dependencies>
<build>
<finalName>RoadDataCollection-${project.version}</finalName>
资源这一部分首先要排除dev,test,product三个目录,不能被打到war包里
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>dev/*</exclude>
<exclude>test/*</exclude>
<exclude>product/*</exclude>
</excludes>
</resource>
</resources>
<plugins>
编译以1.6编译,没什么好说的
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF8</encoding>
</configuration>
</plugin>
资源部分,选择执行copy-resources,将开发时用的资源和mybatis的xml复制过去.注意看红色的部分
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>copy-resources</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<resources>
<resource>
<directory>src/main/resources/dev</directory>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</configuration>
</plugin>
ant这一部分,是用一个ant命令将一部分已经编译好的class中的一部分复制到api目录去,ant的脚步本下面贴
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<configuration>
<tasks>
<ant antfile="./build.xml" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
打jar包这一部分,把classesDirectory定义到刚才ant复制过去的api目录,从这个目录使用classes文件进行打包,这个包里没有配置文件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>这个地方是说明jar包是带目录的,这样spring扫描就没有问题
</manifest>
</archive>
<classesDirectory>target/api</classesDirectory>
</configuration>
<executions>
<execution>
<id>make-a-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>api</classifier>打了一个以-api结尾的jar包
</configuration>
</execution>
</executions>
</plugin>
war包的部分,通过过滤,把对应的配置文件打进来,直接package的话会打dev,如果要打别的包,比如test的包,要package -Ptest
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
</archive>
<warName>RoadDataCollection</warName>
<webResources>
<resource>
<directory>src/main/resources/${package.environment}</directory>
<targetPath>WEB-INF/classes</targetPath>
<filtering>true</filtering>
</resource>
<resource>
<directory>${project.build.directory}/classes</directory>
<includes>
<include>**/*.*</include>这里是复制所有的classes和xml,因为maven默认是不打xml的,只要手工再做一次
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
这里就是多环境配置的部分了
<profiles>
<profile>
<id>dev</id>
<properties>
<package.environment>dev</package.environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!--默认启用的是dev环境配置 -->
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<package.environment>test</package.environment>
</properties>
</profile>
<profile>
<id>product</id>
<properties>
<package.environment>product</package.environment>
</properties>
</profile>
</profiles>
</project>
下面是build.xml的内容:
<?xml version="1.0"?>
<project name="javaTest" default="jar" basedir=".">
<property name="main.dir" value="${basedir}/target" />
<property name="classes.dir" value="${main.dir}/classes" />
<property name="api.dir" value="${main.dir}/api" />
<target name="copyConfig">
<delete dir="${api.dir}"/>
<mkdir dir="${api.dir}" />
<copy todir="${api.dir}">
<fileset dir="${classes.dir}">
<include name="**/*.class" />
<include name="**/dao/*.xml" />
<exclude name="**/ImportShpService*.class" />
<exclude name="**/controller/*.class" />
<exclude name="**/security/controller/*.class" />
</fileset>
</copy>
</target>
<target name="jar" depends="copyConfig">
</target>
</project>
下面是我的目录结构: