2

我知道这不是推荐的做法,我已阅读:

http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

我同意。但目前我需要解决以下问题:

我有一个包含多个 src 文件夹 A 和 B 的项目(使用 build-helper-maven-plugin)。我需要创建两个对应的 jars A(默认 jar)和 B。Jar A 包含来自 src 文件夹 A 的类,jar B 包含来自 src 文件夹 B 的类。

首先,我创建默认 jar A 并尝试从 src 文件夹 B 中排除所有类:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <excludes>
                            <exclude>**/B*</exclude>
                        </excludes>
                    </configuration>
                </execution> 

但是当我检查 A jar 时,它包含源文件夹 B 中包中的类。我的 reqex 排除符号是否错误/它只适用于包?

基于以下答案,我现在做:

<properties>
    <artifactId.model>${project.artifactId}-model-${project.version}</artifactId.model>
    <artifactId.default>${project.artifactId}-${project.version}</artifactId.default>
</properties>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <id>make-model-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${artifactId.model}</finalName>
                        <descriptors>
                            <descriptor>src/main/assembly/model.xml</descriptor>
                        </descriptors>
                        <attach>true</attach>
                    </configuration>
                </execution>
                <execution>
                    <id>make-default-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${artifactId.default}</finalName>
                        <descriptors>
                            <descriptor>src/main/assembly/default.xml</descriptor>
                        </descriptors>
                        <attach>true</attach>
                    </configuration>
                </execution>
            </executions>
        </plugin>

其中模型的描述符是:

<assembly>
    <id>model</id>
    <formats>
        <format>jar</format>
    </formats>
    <baseDirectory>target</baseDirectory>
    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>${basedir}/model_a</directory>
            <includes>
                <include>**/**</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${basedir}/model_b</directory>
            <includes>
                <include>**/**</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

然后我使用构建助手附加罐子。上面的问题显然是我得到 .java 文件而不是编译的 .class 文件。由于所有 .class 文件都位于所有源文件夹的相同 target/classes 文件夹中(请参阅 noahz 注释),我需要为相关包手动指定每个包含/排除 - 所以这种方法是行不通的 :-( 我认为最好的方法是创建一个子项目。

4

2 回答 2

0

这几乎是我给出的答案的副本:

您可以使用程序集插件的不同执行,然后将生成的程序集附加到构建中。当然,您必须在程序集插件配置中为工件配置不同的最终名称。在程序集描述符中,您必须配置要包含的内容

于 2012-10-08T15:08:00.693 回答
0

是的,Jar 插件的include/exclude是用于包的,它不考虑原始源文件的物理位置。

考虑将此项目拆分为两个子模块。

替代方法

正如我经常说的:对于 90% 的构建需求,有 Maven。对于其他一切,有 Antrun 插件。

您将不得不使用 Ant Jar Task生成您的 jar ,并利用该includesfile参数。该文件可以是硬编码的,也可以由您在构建时执行的脚本生成(即find每个源目录下的所有文件并输出到您的包含文件)。

不是最好的解决方案,但它应该可以实现您的目标(虽然两个子模块会更容易)。

于 2012-10-08T15:03:22.570 回答