如何将文件添加到 EAR META-INF 文件夹 - Maven
Posted
技术标签:
【中文标题】如何将文件添加到 EAR META-INF 文件夹 - Maven【英文标题】:How to add a file to EAR META-INF folder - Maven 【发布时间】:2014-05-26 09:52:21 【问题描述】:我想将startup MBEAN
文件(startup-client-service.xml)
从我的EJB
>META-INF
移动到EAR
> META-INF
文件夹。我尝试使用maven-resources-plugin
插件,但它只是将文件从EJB
>META-INF
复制到ear
文件夹中的Target
。但是在内置的ear
startup-client-service.xml
文件在META-INF
中不可用
如何将我的启动文件移动到 META-INF 到 ear > META-INF ?
这是ear的pom文件。
<?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>
<parent>
<groupId>com.testapp</groupId>
<artifactId>my-client-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<name>Test app EAR</name>
<artifactId>my-client-ear</artifactId>
<packaging>ear</packaging>
<dependencies>
<dependency>
<groupId>com.testapp</groupId>
<artifactId>my-client-ejb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>ejb</type>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.8</version>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<modules>
</modules>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>META-INF</outputDirectory>
<resources>
<resource>
<directory>$project.parent.basedir/ejb/src/main/resources/META-INF</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-ear-plugin
</artifactId>
<versionRange>
[2.8,)
</versionRange>
<goals>
<goal>
generate-application-xml
</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>copy_bundle</id>
<properties>
<install.dir>$jboss.dir\server\default\deploy</install.dir>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>Copying bundle to destination folder</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy
file="$project.build.directory/$project.build.finalName.$project.packaging"
overwrite="true" todir="$install.dir" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
下面是项目工作区屏幕截图
【问题讨论】:
没有完整的项目结构和完整的 pom 文件,很难猜出你在构建中做了什么。 @khmarbaise 我更新了我耳朵的整个 pom 文件。我的项目基本上有 2 个模块。一个是API,另一个是ejb。 【参考方案1】:我建议你在准备包阶段使用 Maven 资源插件将文件复制到 $build.directory/$project.artifactId-$project.version/META-INF 文件夹中压缩最终 EAR 的文件夹。阶段准备包就在 EAR 压缩之前。
【讨论】:
知道是否有办法挂钩到 maven-ear-plugin 以在插件复制工件之后、压缩它们之前执行某些操作?我需要添加一个基于工件清单文件的文件。 goo.gl/gD3Tcu 你可以在耳朵生成后使用maven解包插件然后重新打包吗?我没有手头的例子,但它在互联网上很普遍...... 谢谢,这确实是一种方法。我选择在某个地方发布/上传文件作为我的构建过程的一部分,因为我需要在其他地方获取这个文件(否则我需要在其他地方再次解压耳朵并获取文件) 正确路径:$project.build.directory/$project.artifactId-$project.version/META-INF/myfile.properties【参考方案2】:正确的方法是将文件添加到src/main/application
而不是src/main/resources
。
您还可以指定不同的earSourceDirectory 配置。
【讨论】:
这是 maven-ear-plugin 文档:maven.apache.org/plugins/maven-ear-plugin/ear-mojo.html。在那里我们可以看到 src/main/application 是 earSourceDirectory 配置的默认值。【参考方案3】: 使用阶段“process-resources”,目标是“resources”(或使用“prepare-package”的 mekondelta 命题) 将输出目录设置为$basedir/target/$project.artifactId-$project.version这是一个完整的例子
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
<configuration>
<outputDirectory>
$basedir/target/$project.artifactId-$project.version
</outputDirectory>
<resources>
<resource>
<directory>$project.parent.basedir/ejb/src/main/resources/META-INF</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
...
【讨论】:
【参考方案4】:根据 mekondelta 的建议,我已成功使用 maven-assembly-plugin 将文件添加到 EAR META-INF。 就我而言,这些文件是 **.properties* 保存在我的项目中的“src/main/resources/META-INF”下。
在我的 POM.XML 中有以下构建配置:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<version>5</version>
<defaultLibBundleDir>lib/</defaultLibBundleDir>
<skinnyWars>true</skinnyWars>
<jboss>
<version>5</version>
<loader-repository>mcsa:loader=my-application</loader-repository>
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
<data-sources>
<data-source>my-ds.xml</data-source>
</data-sources>
</jboss>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-metainf</id>
<!--<phase>initialize</phase>-->
<phase>generate-resources</phase>
<configuration>
<!--<finalName>.</finalName>-->
<finalName>$project.artifactId-$project.version</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/resources/metainf-assembly.xml</descriptor>
</descriptors>
</configuration>
<goals>
<goal>directory</goal>
</goals>
</execution>
</executions>
</plugin>
</build>
metainf-assembly.xml如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2
http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>meta-data</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>dir</format>
</formats>
<fileSets>
<fileSet>
<directory>$project.build.directory/filtered-resources/META-INF/</directory>
<outputDirectory>META-INF</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
</fileSets>
【讨论】:
【参考方案5】:我设法使用 maven-resources-plugin 做到了
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>$basedir/target/$env.APPLICATION_NAME/META-INF/</outputDirectory>
<resources>
<resource>
<directory>src/main/application/</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
example project structure
注意:资源需要位于 src\main\application\META-INF\weblogic-application.xml
【讨论】:
【参考方案6】:最简单的方法,至少如果它不是 EAR(没有尝试过),就是简单地在 ./src/main/resources 中拥有一个包含所需文件的 META-INF 目录。 当然不能解决你的问题是文件生成到不同的地方。
【讨论】:
拯救了我的一天 :)以上是关于如何将文件添加到 EAR META-INF 文件夹 - Maven的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 代码使用 jboss-cli 命令将 EAR 文件部署到 wildfly-17.0.1 服务器
为啥 Glassfish 会生成一个不完整的 grant.policy 文件?