1

我有一个多模块 maven 项目,它必须生成 RMI 存根(与不能使用动态代理的遗留产品集成)。我已将 rmic-maven-plugin 配置为在编译阶段执行 rmic,并在打包阶段打包存根 jar。

<execution>
        <id>rmic-process-classes</id>
        <goals>
          <goal>rmic</goal>
        </goals>
        <phase>compile</phase>
        <configuration>
          <keep>true</keep>
          <!--outputDirectory>${project.build.outputDirectory}</outputDirectory-->
          <includes>
            <include>com.MyImpl</include>
          </includes>
        </configuration>
      </execution>
      <execution>
        <id>rmic-package</id>
        <goals>
          <goal>package</goal>
        </goals>
        <configuration>
          <!--outputDirectory>${project.build.outputDirectory}</outputDirectory>
          <finalName>broker-dl</finalName>
          <classifier>${project.version}</classifier-->
        </configuration>
      </execution>

在我的“-dist”模块中创建程序集后,我遇到了一个问题,该模块是用于创建分发存档的父模块的子模块。它不包括由 rmic-package 执行生成的客户端 jar。

如何配置程序集插件以包含 rmic 插件在打包阶段生成的 jar?我尝试<files.在 之后添加一个部分<moduleSets>,但是当 files 部分存在时,只有这些文件最终出现在我的程序集中,就好像 moduleSet 部分不存在一样。

      <moduleSets>
      <moduleSet>
          <useAllReactorProjects>true</useAllReactorProjects>
          <includes>
              <include>com:ImplModule</include>
           </includes>
          <binaries>
              <unpack>false</unpack>
              <fileMode>644</fileMode>
              <directoryMode>755</directoryMode>
              <dependencySets>
                <dependencySet>
                  <outputDirectory>lib</outputDirectory>
                </dependencySet>
              </dependencySets>
          </binaries>
      </moduleSet>     
   </moduleSets>
   <files>
       <file>           
           <outputDirectory>lib</outputDirectory>
           <source>../ImplModule/target/ImplModule-${project.version}-client.jar</source>
           <fileMode>644</fileMode>
       </file>       
   </files>

注意:我已经阅读了一个相关的问题,但是创建一个存根项目似乎是不可能的,因为生成存根的 RMI 服务器类显然需要成为主应用程序 jar 的一部分,而不是存根 jar 的一部分,所以我不看不到如何在一个模块中对 RMI 服务器进行 rmic,而在另一个模块中对其进行 javac。

4

1 回答 1

0

通过从使用 moduleSets 切换到 fileSets 和 dependencySets 的组合,我能够自己解决这个问题。文件集为程序集的根目录提取主 jar,并将 rmic 客户端 jar 从 rmic-package 目标提取到 lib 目录中。然后,dependencySet 将主 jar 的所有依赖项也拉到 lib 目录中。

<!-- Include the -dl jar created by the rmic-package goal in
        the lib part of the assembly. It is necessary because 
        the target VM does not support dynamic RMI stubs, so the 
        stubs must be deployed in the assembly. -->
   <fileSets>
       <fileSet>
           <directory>../{project}/target</directory>
           <outputDirectory>.</outputDirectory>
           <!-- put the main jar in the top level -->
           <includes>
               <include>*.jar</include>
           </includes>
           <!-- don't include the RMIC-built -dl jar at the top -->
           <excludes>
               <exclude>*-dl-*.jar</exclude>
           </excludes>
       </fileSet>
       <fileSet>
           <directory>../{project}/target</directory>
           <outputDirectory>lib</outputDirectory>
           <!-- put the RMIC-built -dl jar in the lib dir -->
           <includes>
               <include>*-dl-*.jar</include>
           </includes>
       </fileSet>
   </fileSets>
   <dependencySets>
       <dependencySet>
           <!-- put all the dependencies in lib, as usual -->
           <useProjectArtifact>false</useProjectArtifact>
           <outputDirectory>lib</outputDirectory>             
           <excludes>
               <!-- don't include the main jar, which is at 
                    the top level already. -->
               <exclude>{groupId}:{artifact}</exclude>
           </excludes>
           <unpack>false</unpack>
       </dependencySet>
   </dependencySets>
于 2012-07-06T20:32:03.523 回答