Использование Maven pom и профиля для создания двух разных файлов war (часть основного модуля) с различными настройками профиля - PullRequest
1 голос
/ 23 января 2012

У меня есть проект модуля maven, который имеет следующие модули:

родительский пом - ядро - веб-достояние - админ - сеть

Как веб, так и администратор зависят от ядра и веб-ресурсов, и у каждого модуля есть свой файл profile.xml.

До сих пор и наш администратор, и Интернет имели одно и то же имя источника данных и веб-сервер, поэтому на всем пути от ядра к общему веб-сайту у нас была ссылка на это имя источника данных. (Фактически заполнитель макроса источника данных, который заменяется из 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>

Core 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>

core 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 -PDEV_WEB, а затем снова чистый пакет mvn -PDEV_ADMIN

core 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) Не знаю, как, но придется исследовать это дальше.

    • Раздельное веб-развертывание и администрирование и сохранение имени источника данных, но с двумя разными веб-серверами, которые имеют разные настройки источника данных. [Наименее вероятный вариант]

Ответы [ 2 ]

0 голосов
/ 25 января 2012

Я закончил рефакторинг кода, чтобы ядро ​​и веб-ресурсы не имели прямой ссылки на профиль источника данных.Все записи источника данных были удалены из profiles.xml в core / web commons, а новые записи сделаны в соответствующих модулях (web / admin).[Я знаю, что это не идеальное решение]

Веб теперь имеет свою собственную запись для datasource-name в profiles.xml, аналогично admin имеет свою собственную запись datasource-name в profiles.xml.Кроме того, ядро ​​определило пружинный компонент источника данных поиска jndi, оно перемещено в соответствующие модули, которые имеют зависимости (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>
0 голосов
/ 24 января 2012

Я бы посоветовал вам сделать ваши артефакты независимыми от среды и заставить их считывать свои конфигурации, например, из системных свойств и / или файлов конфигурации, которые находятся за пределами артефактов в файловой системе.

Тип обилия профилейВы предлагаете, кажется, кошмар для меня.Что делать, если вы сократили релиз с помощью плагина релиза?Какой профиль вы бы активировали тогда?Также обратите внимание, что в Maven 3 была удалена поддержка profile.xml.

...