maven解决打war包时同时打jar包,根据不同的环境打包,用myeclipse同步到tomcat时的相关问题

本文介绍了如何在Maven项目中处理一个变态需求:既要打包成WAR又要打包成JAR,JAR包仅包含部分classes且不包含资源文件。同时,项目需要针对开发、测试和生产环境进行差异化打包,并确保在MyEclipse中能够顺利同步到Tomcat。文章提供了一份详细的pom.xml配置和build.xml内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个变态的需求,一个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>
下面是我的目录结构:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值