0

我是 Maven 新手,我正在尝试将 Maven 配置为生成 2 个 jar:一个用于 development ,一个用于 production。它们之间的唯一区别是 config.properties 文件的数据库连接不同,所以我想我可以使用Maven 配置文件

令我惊讶的是,我无法同时生成这两个文件。使用配置文件时,每次构建时都必须选择配置文件,并且将使用配置文件创建一个 jar(在我的情况下)。问题是它将创建 2 个完全相等的 jar,一个没有分类器,一个有分类器(如 myjar.jar 和 myjar-prod.jar),所以如果我想生成 dev 和 prod jar,我必须创建 4 jars(使用一个配置文件运行第一个 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>
4

2 回答 2

1

如果您对分类 jar 没问题,您可以在没有配置文件的情况下做您想做的事情,因此您可以使用单个构建命令为所有环境创建 jar。关键是要了解Maven 过滤是如何工作的。

这是我对类似问题提供的答案的扩展。从该设置开始。然后:

config.properties在您的中创建src/main/resources,包含您的应用程序需要的属性。

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

现在,为每个环境创建prod.propertiesdev.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文件,其中包含环境的正确属性。过滤器不会最终出现在构建的罐子中。

于 2013-03-08T21:59:17.270 回答
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> 
于 2013-03-08T19:43:20.183 回答