maven-ear-plugin - Как манипулировать Manifest.MF webModule и ejbModule?

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

    app (parent)
    -- pom.xml
    -- app-ear
       -- pom.xml
    -- app-ejb
       -- src
       -- pom.xml
    -- app-web
       -- src
       -- pom.xml

приложение /pom.xml

Это мой app/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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany</groupId>
    <artifactId>app</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>app</name>
    <url>http://maven.apache.org</url>

    <modules>
        <module>app-ejb</module>
        <module>app-web</module>
        <module>app-ear</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>javax.ejb</groupId>
            <artifactId>ejb-api</artifactId>
            <version>3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javaee</groupId>
            <artifactId>javaee-api</artifactId>
            <version>5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
            <version>2.0.9</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.richfaces.ui</groupId>
            <artifactId>richfaces-components-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>org.richfaces.core</groupId>
            <artifactId>richfaces-core-impl</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.richfaces</groupId>
                <artifactId>richfaces-bom</artifactId>
                <version>4.2.0.Final</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

приложение-ejb/pom.xml

Это мой app-ejb/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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>app</artifactId>
        <groupId>com.mycompany</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>app-ejb</artifactId>
    <packaging>ejb</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ejb-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <ejbVersion>3.0</ejbVersion>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Это мой app-web/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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>app</artifactId>
        <groupId>com.mycompany</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>app-web</artifactId>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>app-ejb</artifactId>
            <version>${project.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>app-web</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>

</project>

приложение-ухо/pom.xml

И, наконец, это мой app-ear/pom.xml, где у меня есть подробная информация о том, как сгенерировать мой файл app.ear:

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>app</artifactId>
        <groupId>com.mycompany</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>app-ear</artifactId>
    <packaging>ear</packaging>

    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>app-ejb</artifactId>
            <type>ejb</type>
            <version>${project.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>app-web</artifactId>
            <type>war</type>
            <version>${project.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <version>5</version>
                    <unpackTypes>war</unpackTypes>
                    <defaultLibBundleDir>lib</defaultLibBundleDir>
                    <skinnyWars>true</skinnyWars>
                    <modules>
                        <webModule>
                            <groupId>com.mycompany</groupId>
                            <artifactId>app-web</artifactId>
                            <bundleFileName>app-web.war</bundleFileName>
                            <contextRoot>/app</contextRoot>
                        </webModule>
                        <ejbModule>
                            <groupId>com.mycompany</groupId>
                            <artifactId>app-ejb</artifactId>
                            <bundleFileName>app-ejb.jar</bundleFileName>
                        </ejbModule>
                        <jarModule>
                            <groupId>org.glassfish</groupId>
                            <artifactId>javax.faces</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>org.richfaces.core</groupId>
                            <artifactId>richfaces-core-api</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>org.richfaces.core</groupId>
                            <artifactId>richfaces-core-impl</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>org.richfaces.ui</groupId>
                            <artifactId>richfaces-components-api</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>org.richfaces.ui</groupId>
                            <artifactId>richfaces-components-ui</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>net.sourceforge.cssparser</groupId>
                            <artifactId>cssparser</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>org.w3c.css</groupId>
                            <artifactId>sac</artifactId>
                        </jarModule>
                        <jarModule>
                            <groupId>com.google.guava</groupId>
                            <artifactId>guava</artifactId>
                        </jarModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Моя проблема в том, что app.ear/app-web.war!META-INF/MANIFEST.MF и app.ear/app-ejb.jar!META-INF/MANIFEST.MF< /em> выглядит так:

    Manifest-Version: 1.0
    Build-Jdk: 1.6.0_24
    Class-Path: lib/javax.faces-2.0.9.jar lib/richfaces-core-api-4.2.0.Fin
     al.jar lib/richfaces-core-impl-4.2.0.Final.jar lib/richfaces-componen
     ts-api-4.2.0.Final.jar lib/richfaces-components-ui-4.2.0.Final.jar li
     b/cssparser-0.9.5.jar lib/sac-1.3.jar lib/guava-10.0.1.jar lib/jsr305
     -1.3.9.jar
    Created-By: Apache Maven
    Archiver-Version: Plexus Archiver

И мне действительно нужно удалить запись Class-Path из этих MANIFEST.

Почему? Потому что кажется, что RichFaces загружается два раза в пути к классам моего приложения. (Один из папки app.ear/lib, а другой из app.ear/app-web.war!META-INF/MANIFEST.MF Class-Path). И когда я пытаюсь развернуть app.ear на своем сервере приложений (Oracle Weblogic 10.3.5), я получаю такие ошибки:

    INFO: Unsanitized stacktrace from failed start...
    java.lang.IllegalArgumentException: duplicate key: class   javax.faces.validator.RequiredValidator
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:72)
at com.google.common.collect.ImmutableMap$Builder.fromEntryList(ImmutableMap.java:221)
at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:207)
at org.richfaces.javascript.ClientServiceConfigParser.parseConfig(ClientServiceConfigParser.java:53)
at org.richfaces.application.ValidatorModule.createClientScriptService(ValidatorModule.java:65)
at org.richfaces.application.ValidatorModule.configure(ValidatorModule.java:60)
at org.richfaces.application.ServicesFactoryImpl.init(ServicesFactoryImpl.java:27)

Странно, что если я запускаю mvn package в своем проекте app-web, запись Class-path не переходит в app-web.war/META-INF/MANIFEST.MF. Это происходит только тогда, когда я запускаю mvn package в своем родительском проекте приложение.

Итак, как я могу удалить запись Class-path файла webModule и ejbModule MANIFEST?

Я нашел аналогичную проблему в этой теме. но без решения.

Я ценю любую помощь.

Спасибо, Маурисио.


person Mauricio    schedule 09.07.2012    source источник
comment
Привет @mauricio, можно ли пометить мой ответ как принятый? Спасибо друг   -  person Alexius DIAKOGIANNIS    schedule 20.11.2019


Ответы (1)


Вам необходимо добавить следующую запись в файл app-ear/pom.xml внутри тега конфигурации.

<archive>
    <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
    </manifest>
    <manifestEntries>
        <Created-On>${build.timestamp}</Created-On>
        <Ant-Version>${ant.version}</Ant-Version>
        <Java-Version>${ant.java.version}</Java-Version>
    </manifestEntries>
</archive>

Как правило, тег addDefaultImplementationEntries, для которого установлено значение false, предотвращает запись всех записей по умолчанию (например, той, которую вы хотите) в манифест. после этого вы можете добавить все, что хотите включить. Я добавил несколько образцов, которые вы можете увидеть.

person Alexius DIAKOGIANNIS    schedule 12.02.2016