使用 Maven,如何在部署阶段之前修改部署文件?
With maven, how to modify deploy files just prior to deploy phase?
我有一个包含一个 war
和几个 ear
项目的 Maven 项目。每个 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
放入最后的 <project>-app.ear/web.war/WEB-INF
。这一切都非常适合构建和创建最终的 EAR 工件。
我遇到的问题是,当我 run
(使用 Netbeans,但这不重要)时,用于部署的 web.xml
(<project>/target/gfdeploy/first-app/web_war/WEB-INF/web.xml
) 是标记化版本。我尝试为 deploy
添加执行阶段,但这不起作用。
如何确保 运行 部署已修改 web.xml
以便我可以在开发期间测试我的应用程序?
这里是耳朵的相关部位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>
您可以 运行 您的 war 使用 jetty-maven-plugin 选择 运行-war 目标。
该目标 运行 打包 war。
参见:https://www.eclipse.org/jetty/documentation/9.4.x/jetty-maven-plugin.html#running-assembled-webapp-as-war
首先,deploy 阶段(构建生命周期)意味着 deployment 一个生产就绪工件到远程 Maven 存储库(例如、Nexus 或 Artifactory)。粗略地说,artifact deploy 可以视为copying the artifact。阅读 the Introduction to the Build Lifecycle 了解更多详情。
其次,Apache Maven 不支持开箱即用应用部署到应用服务器。但是,有几种方法可以做到这一点,具体取决于您使用的应用程序服务器。你用哪一个?
可以为 JBoss 应用程序服务器找到特殊插件 - jboss-as-maven-plugin. See usage example:
<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 执行两步 部署:
- 构建项目:运行
mvn package
所有插件都在打包阶段配置。
- 部署项目:运行 来自 Netbeans 的应用程序服务器上的应用程序(如果支持)(参见 NetBeans Java EE Servers Support 页)。
希望对您有所帮助。
我建议您在开发过程中保持默认 src/main/webapp/WEB-INF/web.xml 对 运行 完全正常运行。然后,保留一个名为src/main/webapp/WEB-INF/web-ear.xml的类似文件,其中包含所有替换准备。
将所有替换插件策略包装在 Maven 配置文件中并定位到 web-ear.xml 文件。添加到此配置文件的 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
我有一个包含一个 war
和几个 ear
项目的 Maven 项目。每个 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
放入最后的 <project>-app.ear/web.war/WEB-INF
。这一切都非常适合构建和创建最终的 EAR 工件。
我遇到的问题是,当我 run
(使用 Netbeans,但这不重要)时,用于部署的 web.xml
(<project>/target/gfdeploy/first-app/web_war/WEB-INF/web.xml
) 是标记化版本。我尝试为 deploy
添加执行阶段,但这不起作用。
如何确保 运行 部署已修改 web.xml
以便我可以在开发期间测试我的应用程序?
这里是耳朵的相关部位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>
您可以 运行 您的 war 使用 jetty-maven-plugin 选择 运行-war 目标。 该目标 运行 打包 war。 参见:https://www.eclipse.org/jetty/documentation/9.4.x/jetty-maven-plugin.html#running-assembled-webapp-as-war
首先,deploy 阶段(构建生命周期)意味着 deployment 一个生产就绪工件到远程 Maven 存储库(例如、Nexus 或 Artifactory)。粗略地说,artifact deploy 可以视为copying the artifact。阅读 the Introduction to the Build Lifecycle 了解更多详情。
其次,Apache Maven 不支持开箱即用应用部署到应用服务器。但是,有几种方法可以做到这一点,具体取决于您使用的应用程序服务器。你用哪一个?
可以为 JBoss 应用程序服务器找到特殊插件 - jboss-as-maven-plugin. See usage example:
<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 执行两步 部署:
- 构建项目:运行
mvn package
所有插件都在打包阶段配置。 - 部署项目:运行 来自 Netbeans 的应用程序服务器上的应用程序(如果支持)(参见 NetBeans Java EE Servers Support 页)。
希望对您有所帮助。
我建议您在开发过程中保持默认 src/main/webapp/WEB-INF/web.xml 对 运行 完全正常运行。然后,保留一个名为src/main/webapp/WEB-INF/web-ear.xml的类似文件,其中包含所有替换准备。
将所有替换插件策略包装在 Maven 配置文件中并定位到 web-ear.xml 文件。添加到此配置文件的 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