避免使用Maven配置文件生成重复的jar

时间:2013-03-08 19:00:19

标签: java maven

我是Maven的新手,我正在尝试配置Maven来生成2个罐子:一个用于开发,一个用于生产。它们之间唯一的区别是config.properties文件,它具有不同的数据库连接,所以我认为我可以使用Maven profiles

令我惊讶我无法一次生成两个文件。使用配置文件时,每次构建时都必须选择配置文件,然后使用配置文件创建一个jar(在我的例子中)。问题是,它将创建2个完全相等的罐子,一个没有分类器,另一个带分类器(像myjar.jar和myjar-prod.jar )所以如果我想生成dev和prod jar我必须创建4个罐子(用一个配置文件运行第一个Maven,然后用另一个配置文件运行)

为什么会这样? 对我没有任何意义......但是好的......

我的问题是:

有没有办法可以避免生成这两个罐?我的意思是,我希望有不同的配置文件,我已经接受(悲伤)执行多次构建过程(每个配置文件一个),我可以避免每次有2个罐子并且只有一个没有分类器吗?

这是我的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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.p2p.</groupId>
    <artifactId>LoadACHFiles</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>MyProject</name>
    <url>http://maven.apache.org</url>
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>          
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>        
            </plugin>           
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>config-*.properties</exclude>          
                </excludes>
            </resource>      
        </resources>
    </build>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.jasypt</groupId>
            <artifactId>jasypt</artifactId>
            <version>1.9.0</version>
            <type>jar</type>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>prod</id>
             <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <executions>
                            <execution>
                                <phase>test</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>                                    
                                    <tasks>
                                        <!--<delete file="${project.build.outputDirectory}/config.properties"/>-->
                                        <copy file="src/main/resources/config-prod.properties"
                                              tofile="${project.build.outputDirectory}/config.properties"/>
                                    </tasks>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.13</version>
                        <configuration>
                            <skip>true</skip>
                        </configuration>
                    </plugin>
                    <plugin>
                        <artifactId>maven-jar-plugin</artifactId>
                        <version>2.4</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                                <configuration>
                                    <classifier>prod</classifier>
                                    <source>1.6</source>
                                    <target>1.6</target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>        
    </profiles>
</project>

2 个答案:

答案 0 :(得分:1)

如果您对分类罐子没问题,那么您可以在没有配置文件的情况下执行您想要的操作,因此您可以使用单个构建命令为所有环境设置罐子。关键是要了解Maven filtering的工作原理。

这扩展了我提供给a similar question的答案。从该设置开始。然后:

config.properties中创建src/main/resources,其中包含您的应用所需的属性。

my.database.url=${database.url}
my.database.user=${database.user}
my.database.pw=${database.pw}

现在,在prod.properties中创建dev.properties${basedir}/src/main/filters,为每个环境保留适当的值。

database.url=URL-for-dev
database.user=user-for-dev
database.pw=pw-for-dev

当您运行mvn clean package时,Maven将复制/src/main/resources的内容,包括config.properties,在复制期间进行财产替换。由于资源和jar插件都有多个执行,因此Maven将创建单独的分类jar文件。每个文件都包含一个config.properties文件,其中包含环境的正确属性。过滤器不会在内置的罐子中结束。

答案 1 :(得分:0)

我删除了个人资料部分中的maven jar插件。改变了这个:

<profile>
        <id>prod</id>
         <build>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>test</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>                                    
                                <tasks>
                                    <!--<delete file="${project.build.outputDirectory}/config.properties"/>-->
                                    <copy file="src/main/resources/config-prod.properties"
                                          tofile="${project.build.outputDirectory}/config.properties"/>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.13</version>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.4</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>jar</goal>
                            </goals>
                            <configuration>
                                <classifier>prod</classifier>
                                <source>1.6</source>
                                <target>1.6</target>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile> 

为此:

<profile>
        <id>prod</id>
         <build>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>test</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>                                    
                                <tasks>
                                    <!--<delete file="${project.build.outputDirectory}/config.properties"/>-->
                                    <copy file="src/main/resources/config-prod.properties"
                                          tofile="${project.build.outputDirectory}/config.properties"/>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.13</version>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>               
            </plugins>
        </build>
    </profile>