我有一个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
<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)不确定如何,但必须进一步调查。
答案 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>