maven 通过配置打不同环境的包

背景:一

项目由不同的分支(如:dev, test, product),每一分支对应的环境变量有差异。需要根据maven打包命令传入不同的参数(如 -Ptest)来实现具体使用哪个分支的配置。

解决方案:

  • 在pom.xml配置的<profiles> </profiles>中添加<profile> </profile>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault> <! - -这里默认是dev- ->
</activation>
<properties>
<envcfg.dir>dev</envcfg.dir>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<envcfg.dir>test</envcfg.dir>
</properties>
</profile>
<profile>
<id>pro</id>
<properties>
<envcfg.dir>product</envcfg.dir>
</properties>
</profile>

<properties> </properties>中配置不同的环境参数(这里是配置文件目录名)。

  • 在pom.xml文件中配置build
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<!--注意这里引用的${envcfg.dir}-->
<directory>src/main/conf/${envcfg.dir}</directory>
</resource>
</resources>
<directory>target</directory>
</build>

<build></build> 配置中添加上一步的文件目录名,这样使用maven -Ptest 命令打包的时候,会将src/main/conf/test目录下的文件都添加到项目路径下面。

背景: 二

如果只配置了<profiles> </profiles>,则当前仓库中同一版本只能有一个jar包,这样选择-Ptest或者-Ppro命令就会覆盖jar包,导致客户端调用产生问题(比如:location-local-0.3.3.jar,这个版本可能是test或者pro,客户端如果生产版本调用了test jar包则会产生异常)。

解决方案: 在每一个分支jar包后面带上分支名称,如:location-local-0.3.5-test.jar;这样客户端就可以选择不同分支的jar包。

  • 在服务端pom.xml中如下配置:(注意加**的地方与背景一不同)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<build></build>标签中配置:
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/conf/${envcfg.dir}</directory>
</resource>
</resources>
<directory>target</directory>
<!--新增部分配置-->
**
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>default-jar</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>${envcfg.classifier}</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
</build>
**
<profile></profile>标签中配置:
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
** <envcfg.classifier>dev</envcfg.classifier> **
<envcfg.dir>dev</envcfg.dir>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
** <envcfg.classifier>test</envcfg.classifier> **
<envcfg.dir>test</envcfg.dir>
</properties>
</profile>
<profile>
<id>pro</id>
<properties>
** <envcfg.classifier>product</envcfg.classifier> **
<envcfg.dir>product</envcfg.dir>
</properties>
</profile>

这里的classifier指向jar包后缀的名称。

  • 客户端pom.xml引用配置如下:
1
2
3
4
5
6
<dependency>
<groupId>com.ximalaya.location</groupId>
<artifactId>location-local</artifactId>
<version>0.3.5</version>
<classifier>test</classifier>
</dependency>

通过classifier可以选择需要引用的jar包。

热评文章