【问题标题】:Include only certain packages in a Maven generated non-runnable jar在 Maven 生成的不可运行的 jar 中仅包含某些包
【发布时间】:2017-10-31 16:41:38
【问题描述】:

我正在尝试构建一个不可执行的 jar 文件,该文件仅包含我项目中的某些包,以用作通用代码的库。我计划将其部署到 Nexus 并将其包含在其他项目中。

我可以通过右键单击项目,选择导出,选择 JAR 文件(不是可运行的 Jar 文件)然后检查我想要包含的包,在 Eclipse 中手动创建它。我试图在 Maven 中模仿这种行为。我已经能够通过不在清单中包含 main 来复制 maven 中的不可运行部分,但仍然必须找出如何仅包含某些包。

这个项目实际上已经构建了 2 个 jar 文件(来自程序中的 2 个不同的主文件 - 一个测试 GUI 和常规应用程序)。我无法找到有关如何执行不可运行 jar 和仅选择某些包的信息。

下面是我的 pom 文件的现有构建部分。 build-third 是不可运行的 jar:

    <plugins>
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>build-first</id>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.joy.fb20.da.exec.jDaExecutive</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>DaExecutive</finalName>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
        <execution>
            <id>build-second</id>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.joy.fb20.gui.jExampleAppGui</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>ExampleAppGui</finalName>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
<execution>
            <id>build-third</id>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>ddslib</finalName>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </plugin>
      </plugins>
    </build>

【问题讨论】:

  • 如何将该部分分离为自己的工件项目并将其作为依赖项添加到您的原始项目中?还有其他需要它的人吗?
  • 我最初想这样做,但代码的维护者拒绝拆分源代码,所以我的双手被束缚在这种方法中。

标签: maven


【解决方案1】:

我自己试过了,这是可能的。

  • 创建一个新的 Maven 配置文件
  • pluginManagement 部分添加到maven-jar-plugin 的新配置文件中,如果需要,还添加maven-resources-plugin 部分
  • 使用此 pluginManagement 配置源/资源的包含/排除并在此处覆盖工件最终名称,以便为该单独的 jar 使用不同的名称

例子

<profiles>
   <profile>
      <id>subset</id>
      <build>
         <pluginManagement>
            <plugins>
               <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jar-plugin</artifactId>
                  <version>3.0.2</version>
                  <configuration>
                     <finalName>subset</finalName>
                     <includes>
                        <include>org/example/stuff/**</include>
                     </includes>
                  </configuration>
               </plugin>
            </plugins>
         </pluginManagement>
      </build>
   </profile>
</profiles>

使用此配置文件,maven 会创建 subset.jar,其中包含 org/example/stuff/** 下的所有内容

查看更多关于排除的信息:How to exclude a set of packages from maven build jar?

当然,没有pluginManagement 也可以做到这一切,但我认为pluginManagement 提供了干净灵活的方式来配置这种东西,所以我建议这样做。

【讨论】:

  • 我不得不将原始版本分离到一个配置文件中,将新版本分离到它自己的配置文件中,这很有效。
【解决方案2】:

您应该能够通过使用自定义程序集描述符并指定您的文件集和/或文件包含/排除来做到这一点。见https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_fileSet

【讨论】:

  • 我试过这样做,通过使用 exclude everything -> * 然后包括我想要的包,它似乎完全忽略了这些命令。
猜你喜欢
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2015-04-19
  • 2015-09-14
  • 2011-04-03
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多