使用Maven,如何在部署阶段之前修改部署文件?

3
我有一个Maven项目,其中包含一个war和几个ear项目。每个ear项目需要稍微不同的war/WEB-INF/web.xml。每个ear的pom.xml使用com.google.code.maven-replacer-plugin:replacer和org.codehaus.mojo:truezip-maven-plugin来替换web.xml中的标记,然后将新的web.xml放置在最终的-app.ear/web.war/WEB-INF中。这在构建和创建最终EAR工件时都很好用。
我遇到的问题是,当我运行(使用Netbeans,但这不应该有影响)时,用于部署的web.xml(/target/gfdeploy/first-app/web_war/WEB-INF/web.xml)是带有标记的版本。我尝试为部署添加执行阶段,但这并不起作用。
如何确保运行部署具有修改后的web.xml,以便我可以在开发期间测试我的应用程序?
以下是ear pom.xml的相关部分:
        <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <version>1.5.3</version>
            <executions>
                <execution>
                    <id>package-replace</id>
                    <phase>package</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
                <execution>
                    <id>deploy-replace</id>
                    <phase>deploy</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>                                        
                <file>${project.parent.basedir}/${web.xml}</file>
                <outputFile>${project.build.directory}/${web.xml}</outputFile>
                <replacements>
                    <replacement>
                        <token>@REALM_NAME@</token>
                        <value>${web.realm}</value>
                    </replacement>
                </replacements>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>truezip-maven-plugin</artifactId>
            <version>1.2</version>
            <executions>
                <execution>
                    <id>package-replace-web-xml</id>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <phase>package</phase>
                    <configuration>
                        <files>
                            <file>
                                <source>${project.build.directory}/${web.xml}</source>
                                <outputDirectory>${project.build.directory}/${project.build.finalName}/${web.zip}/WEB-INF</outputDirectory>
                            </file>
                        </files>
                    </configuration>
                </execution>
                <execution>
                    <id>package-replace-web</id>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <phase>package</phase>
                    <configuration>
                        <files>
                            <file> 
                               <source>${project.build.directory}/${project.build.finalName}/${web.zip}</source>
                                <outputDirectory>${project.build.directory}/${project.build.finalName}.ear</outputDirectory>
                            </file>
                        </files>
                    </configuration>
                </execution>
                <execution>
                    <id>deploy-replace-web-xml</id>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <phase>deploy</phase>
                    <configuration>
                        <files>
                            <file>
                                <source>${project.build.directory}/${web.xml}</source>
                                <outputDirectory>${project.build.directory}/gfdeploy/${project.artifactId}/web-${project.version}_war/WEB-INF</outputDirectory>
                            </file>
                        </files>
                    </configuration>
                </execution>
            </executions>
        </plugin>

这些EAR / web.xml文件有什么区别?顺便问一下,为什么不将相应的web.xml放入相应的war模块中呢? - khmarbaise
WAR对所有EAR项目都是通用的,唯一的区别在于身份验证领域。每个EAR都有几个EJB模块以及共同的WAR。有些EJB是通用的,并包含在所有EAR中,而其他EJB则是针对包含它的EAR定制的。目前,在<war>/WEB-INF/web.xml中唯一的区别是认证领域,因为每个领域都需要有自己的认证领域名称。 - John Manko
你是否考虑过另一种方法,比如 https://tomcat.apache.org/tomcat-7.0-doc/mbeans-descriptors-howto.html? - Hannes
使用Payara。这不是运行时问题,而是开发问题。生产构建很好。 - John Manko
3个回答

2
我建议在开发过程中保持默认的 src/main/webapp/WEB-INF/web.xml 文件的完整功能。然后,创建一个名为 src/main/webapp/WEB-INF/web-ear.xml 的类似文件,并进行所有替换准备工作。
将所有替换插件策略包装在一个 maven profile 中,并针对 web-ear.xml 文件进行定位。向该 profile 添加 maven-war-plugin 配置,该配置将在构建期间使用替代的 web-ear.xml 文件,而不是默认的 web.xml (请参阅:http://maven.apache.org/plugins/maven-war-plugin/)。
<profiles>
    <profile>
        <id>change-war-profile</id>
        <build>
            <plugins>
                <!-- all your replacement plugins here -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <webXml>src/main/webapp/WEB-INF/web-ear.xml</webXml>
                    </configuration>
                </plugin>
            <plugins>
        </build> 
    </profile>
</profiles>

确保在EAR Maven构建期间激活此配置文件:

mvn package -Pchange-war-profile

0
首先,“部署”阶段(构建生命周期中的一部分)意味着将“产品准备就绪的构件”部署到远程 Maven 存储库(例如 Nexus 或 Artifactory)。粗略地说,“构件部署”可以视为“复制构件”。有关详细信息,请阅读构建生命周期介绍
其次,Apache Maven 不支持开箱即用地向应用程序服务器部署应用程序。但是,具体取决于您使用的应用程序服务器,有几种方法可以实现。您使用哪种?
针对 JBoss 应用程序服务器可以找到特殊的插件 - jboss-as-maven-plugin。请参阅使用示例
<project>
    ...
    <build>
        ...
        <plugins>
            ...
            <plugin>
                <groupId>org.jboss.as.plugins</groupId>
                <artifactId>jboss-as-maven-plugin</artifactId>
                <version>7.9.Final</version>
                <executions>
                    <execution>
                        <phase>install</phase>
                        <goals>
                            <goal>deploy</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            ...
        </plugins>
        ...
    </build>
...
</project>

在 GlassFish Server 中可以找到类似的插件:glassfish-maven-plugin

此外,如果您认为这样做是可行的,您可以从 Netbeans 执行 2 步 部署

  1. 构建项目:使用所有配置在 package 阶段的插件运行 mvn package
  2. 部署项目:从 Netbeans 上的应用服务器上运行应用程序(如果支持)(请参阅 NetBeans Java EE Servers Support 页面)。

希望这可以帮助到您。


0

Jetty无法工作。我需要在完整的EE配置文件容器中运行,因为每个EAR都有几个ejb模块以及WAR。 - John Manko
你是否考虑过使用Maven和Cargo插件部署你的EAR文件,而不是使用NetBeans进行部署?请参考以下链接:https://codehaus-cargo.github.io/cargo/Maven2+plugin.html 或 https://dev59.com/2p_ha4cB1Zd3GeqPvDRL?rq=1 - gdegani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接