Maven pom和配置文件用法生成具有不同配置文件设置的两个不同的war(部分主模块)文件

时间:2012-01-23 16:31:20

标签: maven profile pom.xml

我有一个maven模块项目,它有以下模块:

父母pom   - 核心   - 网络公共   - 管理员   - 网站

web和admin都依赖于core和web-commons,每个模块都有自己的profile.xml。

到目前为止,我们的管理员和网站都共享相同的数据源名称和Web服务器,因此从核心到web-commons一直都有这个数据源名称的引用。 (实际上是在构建期间从profiles.xml替换的数据源宏占位符。)

但是,我们必须分离数据源,现在我正在尝试找出最佳方法。

为清晰起见,这是代码段。 父母:

<?xml version="1.0" encoding="UTF-8"?>
<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.my.groupId</groupId>
    <artifactId>parentArtifact</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    ...
    <modules>
        <<module>core</module>
        <module>web-commons</module>
        <module>admin</module>
        <module>web</module>
    </modules>
<project>

核心pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.my.groupId</groupId>
    <artifactId>core</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    ...
<project>

核心Profiles.xml

<profilesXml xmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <datasource.name>web_datasource</datasource.name>
                 ...
            </properties>
        </profile>
    </profiles>
</profilesXml>

web-commons pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.my.groupId</groupId>
    <artifactId>web-commons</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    ...
    <dependencies>
        <dependency>
            <groupId>com.my.groupId</groupId>
            <artifactId>core</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
<project>

web-commons Profiles.xml

<profilesXml xmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <datasource.name>web_datasource</datasource.name>
                 ...
            </properties>
        </profile>
    </profiles>
</profilesXml>

web 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>
    <parent>
        <artifactId>parentArtifactId</artifactId>
        <groupId>com.my.groupId</groupId>
        <version>1.0</version>
    </parent>
    <groupId>com.my.groupId</groupId>
    <artifactId>web</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>com.my.groupId</groupId>
            <artifactId>core</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>com.my.groupId</groupId>
            <artifactId>web-commons</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
    ....
</project>

web profiles.xml

<profilesXml xmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <timeout>90</timeout>
                 ...
            </properties>
        </profile>
    </profiles>
</profilesXml>

admin 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>
    <parent>
        <artifactId>parentArtifactId</artifactId>
        <groupId>com.my.groupId</groupId>
        <version>1.0</version>
    </parent>
    <groupId>com.my.groupId</groupId>
    <artifactId>admin</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>com.my.groupId</groupId>
            <artifactId>core</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>com.my.groupId</groupId>
            <artifactId>web-commons</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
    ....
</project>

admin profiles.xml

<profilesXml xmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <timeout>120</timeout>
                 ...
            </properties>
        </profile>
    </profiles>
</profilesXml>

可能的解决方案:

  • 更改核心profiles.xml和所有后续的profiles.xml,然后运行 mvn clean package -PDEV_WEB然后再次 mvn clean package -PDEV_ADMIN

核心Profiles.xml

<profilesXml xmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV_WEB</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <datasource.name>web_datasource</datasource.name>
                 ...
            </properties>
        </profile>
        <profile>
            <id>DEV_ADMIN</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <datasource.name>admin_datasource</datasource.name>
                 ...
            </properties>
        </profile>

    </profiles>
</profilesXml>
  • 按原样保留所有pom.xml和profiles.xml并找到maven生命周期点,我们可以在其中生成web.war(其中包含core.jar和web-commons.jar,其中包含web_datasource)然后生成admin.war(有core.jar和web-commons.jar,有admin_datasource)不确定如何,但必须进一步调查。

    • 单独的Web和管理员部署并保留数据源名称,但有两个不同的Web服务器具有不同的数据源设置。 [最不可能的选择]

2 个答案:

答案 0 :(得分:0)

我建议你让你的工件与环境无关,并让他们从e中读取他们的配置。 G。系统属性和/或配置文件,它们位于文件系统上的工件之外。

你建议的那种轮廓丰富似乎对我来说是一个维持噩梦。如果您使用发布插件剪切版本怎么办?那么你会激活哪个档案?另请注意,在Maven 3中删除了对profile.xml的支持。

答案 1 :(得分:0)

我最终重构了代码,以便核心和Web公共文件没有任何对数据源配置文件的直接引用。所有数据源条目都已从core / web commons中的profiles.xml和相关模块中的新条目(web / admin)中删除。 [我知道这不是一个理想的解决方案]

Web现在在profiles.xml中有自己的datasource-name条目,类似地,admin在profiles.xml中有自己的datasource-name条目。此外,core定义了一个jndi查找数据源spring bean,它被移动到具有依赖关系的相关模块(web / admin)。

Web profiles.xml

<profilesXmlmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <timeout>90</timeout>
                 <datasource-name>dev_web</datasource-name>
                 ...
            </properties>
        </profile>
    </profiles>
</profilesXml>

Admin profiles.xml

<profilesXmlmlns="http://maven.apache.org/PROFILES/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/PROFILES/1.0.0 http://maven.apache.org/xsd/profiles-1.0.0.xsd">
    <profiles>
        <profile>
            <id>DEV</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>                
                 <timeout>120</timeout>
                 <datasource-name>dev_admin</datasource-name>
                 ...
            </properties>
        </profile>
    </profiles>
</profilesXml>