首页  编辑  

Idea/Java/Maven支持多配置最优美的解决方案

Tags: /Java/   Date Created:

Maven Sync支持多种配置

如何让Maven Sync的时候,支持切换不同配置?
例如在开发的时候,可能使用不同的Repo来Sync project,因为有的企业开发当中,使用了不同的Maven服务器,例如DEV下的Maven库可能比较齐全,但是生产环境下的Maven库是有限的,避免版权或者安全漏洞而少了一些包,所以我们可能需要在DEV,PRD等环境下切换Maven库,下面就是简单的方法:
修改 maven 配置文件,例如 %userprofile%\.m2\settings.xml ,在 profiles 部分,增加一些新的Maven库即可,例如:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
    <proxies>
        <proxy>
            <id>optional</id>
            <active>true</active>
            <protocol>http</protocol>
            <username>proxyuser</username>
            <password>proxypass</password>
            <host>www.abc.com</host>
            <port>8080</port>
            <nonProxyHosts>local.net|server.com|dev.server.com</nonProxyHosts>
        </proxy>
    </proxies>
    <servers>
        <server>
            <username>xxx</username>
            <password>---</password>
            <id>central</id>
        </server>
        <server>
            <username>xxx</username>
            <password>---</password>
            <id>snapshots</id>
        </server>
    </servers>
    <profiles>
        <profile>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>maven-dev</name>
                    <url>https://dev.server.com:1234/artifactory/maven-dev</url>
                </repository>
                <repository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>maven-dev</name>
                    <url>https://dev.server.com:1234/artifactory/maven-dev</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>maven-dev</name>
                    <url>https://www.abc.com:55743/artifactory/maven-dev</url>
                </pluginRepository>
                <pluginRepository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>maven-dev</name>
                    <url>https://www.abc.com/artifactory/maven-dev</url>
                </pluginRepository>
            </pluginRepositories>
            <id>maven-dev</id>
        </profile>
        <profile>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>maven-prd</name>
                    <url>https://prd.server.com:55743/artifactory/maven-prd</url>
                </repository>
                <repository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>maven-prd</name>
                    <url>https://prd.server.com:55743/artifactory/maven-prd</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>maven-prd</name>
                    <url>https://artifactrepo.server:55743/artifactory/maven-prd</url>
                </pluginRepository>
                <pluginRepository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>maven-prd</name>
                    <url>https://artifactrepo.server:55743/artifactory/maven-prd</url>
                </pluginRepository>
            </pluginRepositories>
            <id>maven-prd</id>
        </profile>
        <profile>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>act_maven_dev</name>
                    <url>https://act.server.com:55743/artifactory/act_maven_dev</url>
                </repository>
                <repository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>act_maven_dev</name>
                    <url>https://act.server.com:55743/artifactory/act_maven_dev</url>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>act_maven_dev</name>
                    <url>https://act.server.com:55743/artifactory/act_maven_dev</url>
                </pluginRepository>
                <pluginRepository>
                    <snapshots/>
                    <id>snapshots</id>
                    <name>act_maven_dev</name>
                    <url>https://act.server.com:55743/artifactory/act_maven_dev</url>
                </pluginRepository>
            </pluginRepositories>
            <id>act_maven_dev</id>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>act-maven-dev</activeProfile>
    </activeProfiles>
</settings>
此后就可以在Idea的Maven窗口里面随意切换配置了。


打包时支持多种配置

Java Maven项目中,开发调测的时候和部署的时候,环境一般是不一样的。如果需要区分不同项目下的application.properties,logback.xml等情况,网络上的方法一般是建立几个目录,分别存放 properties 文件,然后在代码里面,用环境变量去替代对应的环境目录。这种方法本质上是没错,但是需要修改代码,实际上比较恶心,属于侵入式的配置,理论上,我们只要修改 pom.xml 就可以做到的,完全不需要和代码有任何结合。
如果打包jar包需要支持PRD, DEV, TEST等各种环境,下面就是最简单优美的方法,只需要涉及到 pom.xml,完全不需要改动任何代码。
1. 首先,在resource目录下,建立 dev, test, prod 等几个目录,并在上述目录下,放置对应的application.properties,logback.xml等配置文件
2. 修改pom.xml。 build/resources 下面增加配置:
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>chromedriver.exe</exclude>
            <exclude>dev/*</exclude>
            <exclude>prod/*</exclude>
            <exclude>test/*</exclude>
        </excludes>
        <filtering>true</filtering>
    </resource>
    <resource>
        <directory>src/main/resources/${profiles.activation}</directory>
        <targetPath>${project.build.outputDirectory}</targetPath>
        <filtering>false</filtering>
    </resource>
</resources>
3. 在pom.xml 下面,/project 节点下,粘贴一下代码:
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <profiles.activation>dev</profiles.activation>
        </properties>
        <activation>
            <!--默认为dev环境打包方式-->
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <profiles.activation>test</profiles.activation>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <profiles.activation>prod</profiles.activation>
        </properties>
    </profile>
</profiles>
此后,在Idea Maven 窗口或者命令行中,切换和指定 Profile,打包的时候就时对应的环境配置了。