Java 将EAR中的所有依赖项移动到Maven中的子文件夹

Java 将EAR中的所有依赖项移动到Maven中的子文件夹,java,maven,ear,Java,Maven,Ear,我目前正在Maven中构建一个EAR文件。当我构建它时,我会在目标文件夹中获得以下内容: -target/ -MyProject.ear -MyProject/ -MainProject.jar -Dependency.jar 如果我在7Zip中打开MyProject.ear,我会看到与MyProject/ 我被要求更改此项,以便所有依赖项都位于子文件夹中,如下所示: -target/ -MyProject.ear -MyProj

我目前正在Maven中构建一个EAR文件。当我构建它时,我会在目标文件夹中获得以下内容:

-target/
    -MyProject.ear
    -MyProject/
        -MainProject.jar
        -Dependency.jar
如果我在7Zip中打开
MyProject.ear
,我会看到与
MyProject/

我被要求更改此项,以便所有依赖项都位于子文件夹中,如下所示:

-target/
    -MyProject.ear
    -MyProject/
        -MainProject.jar
        -lib/
            -Dependency.jar
<build>
[...]
<plugins>
  <plugin>
       <artifactId>maven-ear-plugin</artifactId>
       <version>2.9</version>
       <!-- All dependencies not otherwise specified are going in /lib -->
       <defaultLibBundleDir>/lib</defaultLibBundleDir>
       <modules>
         <jarModule>
           <!-- An exception to keep the main project in the root -->
           <groupId>MainProject</groupId>
           <artifactId>MainProject</artifactId>
           <bundleDir>/</bundleDir>
         </jarModule>
      </modules>
    </configuration>
  </plugin>
</plugins>
现在,通过对pom.xml文件进行以下更改,我可以为one依赖项实现这一点:

<build>
    [...]
    <plugins>
        <plugin>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                <modules>
                    <jarModule>
                        <groupId>Dependency</groupId>
                        <artifactId>Dependency</artifactId>
                        <bundleDir>lib</bundleDir>
                    </jarModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>
</build>
我希望上面的代码能够获取所有工件并将它们放入lib文件夹中。不幸的是,这在Maven 3.2.1中似乎不起作用,提供了一个错误,指出
Artifact[jar::::::]不是项目的依赖项


那么,在Maven中构建EAR时,如何将所有依赖项移动到子文件夹中呢?

您应该将捆绑目录限制移动到Maven EAR插件的构建配置下,如下所示:

<build>
<finalName>${project.artifactId}</finalName>  
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>${maven-ear-plugin.version}</version>
    <configuration>
       <modules>
         <jarModule>
           <groupId>${group_id}</groupId>
           <artifactId>${artifact_id}</artifactId>
           <bundleDir>lib</bundleDir>
         </jarModule>
         <webModule>
           ...
         </webModule>
      </modules>
      <defaultLibBundleDir>/lib</defaultLibBundleDir>
    </configuration>
  </plugin>
</plugins>

${project.artifactId}
org.apache.maven.plugins
maven耳朵插件
${maven ear plugin.version}
${group_id}
${artifact_id}
解放党
...
/解放党


希望能有所帮助。

由于一次测试后未能完全清理pom文件的愉快事故,我发现了如何做到这一点

标记中,添加
/lib
。默认情况下,这将把所有模块放在目录根目录下的
lib
文件夹中。不需要通配符;事实上,Maven在这一部分中不支持通配符,可能是因为没有明确的界限(可以解释为“移动所有工件”)。通配符只适用于排除,因为有明确的界限;它是一组明确定义的工件的子集

如果您想创建一个异常,那么可以指定模块并键入
/
,这将把它放回根目录中。完整的XML如下所示:

-target/
    -MyProject.ear
    -MyProject/
        -MainProject.jar
        -lib/
            -Dependency.jar
<build>
[...]
<plugins>
  <plugin>
       <artifactId>maven-ear-plugin</artifactId>
       <version>2.9</version>
       <!-- All dependencies not otherwise specified are going in /lib -->
       <defaultLibBundleDir>/lib</defaultLibBundleDir>
       <modules>
         <jarModule>
           <!-- An exception to keep the main project in the root -->
           <groupId>MainProject</groupId>
           <artifactId>MainProject</artifactId>
           <bundleDir>/</bundleDir>
         </jarModule>
      </modules>
    </configuration>
  </plugin>
</plugins>

这不管用。我准确地复制了它(并将版本更改为硬编码版本,因为我没有该属性),但仍然得到错误
工件[jar:::::]不是项目的依赖项
您是否将jar模块声明为企业项目的依赖项?是的,我已将它们声明为依赖项。如果我尝试制作一个EAR而不尝试将它们移动到lib文件夹中,那么所有内容都会生成。当我运行
mvn包时,没有错误或缺少依赖项或任何东西。事实上,我不认为我在最初的问题中展示的结果会发生,如果它们不是依赖性的话。所以我的答案中已经提到了这个技巧不?也许您可以接受它,因为它有助于找到解决方案,thx。@t您的答案包含
标记,这是正确解决方案的必要组成部分,但通配符不正确,最终解决方案不起作用。因为它不是一个有效的解决方案,所以我会接受它,因为它对我和其他人都有效。对不起,通配符是用来替换你的jar组和工件ID的,不能按原样放置。。。我的诀窍是在maven-ear插件配置下添加
。请更新我的答案,因为它有助于解决您的问题,谢谢。