【问题标题】:How to add a file to EAR META-INF folder - Maven如何将文件添加到 EAR META-INF 文件夹 - 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。

标签: java maven jboss ear mbeans


【解决方案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 配置。

【讨论】:

【解决方案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 目录。 当然不能解决你的问题是文件生成到不同的地方。

        【讨论】:

        • 拯救了我的一天 :)
        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 2010-11-20
        • 2015-12-29
        • 2019-09-19
        • 2021-08-10
        相关资源
        最近更新 更多