如何在我指定为附加存储库的本地子目录中创建私有 JAR?

How to create a private JAR in a local subdirectory which I have designated as an additional repository?

在项目下的一个子目录中,我有一个我编写和维护的代码库模块,必须与更大项目中的其他模块共享。为方便起见,它与使用它的所有模块同时开发。

project
  libs
  module-A
  module-B
  module-N
  library-module

由于构建离开我们之后如何完成的复杂原因,我们不希望将其部署到构建主机的本地 Maven 存储库 (~/.m2/repository)。相反,我们希望它位于项目本地的子目录中,此处为 libs.

从命令行,我知道下面会把它放到本地Maven仓库中,但是我不想从命令行这样做,我不希望结果转到本地Maven存储库。当库模块子目录中的构建系统 mvn install 为 运行 时,我希望发生这种情况。

mvn install:install-file -Dfile=your-artifact-1.0.jar \
                         [-DpomFile=your-pom.xml] \
                         [-Dsources=src.jar] \
                         [-Djavadoc=apidocs.jar] \
                         [-DgroupId=org.some.group] \
                         [-DartifactId=your-artifact] \
                         [-Dversion=1.0] \
                         [-Dpackaging=jar] \
                         [-Dclassifier=sources] \
                         [-DgeneratePom=true] \
                         [-DcreateChecksum=true]

(请注意,我正在寻找的答案不会 IDE 依赖。)

为了满足提供的要求,需要两个配置步骤:

  • 禁止通过 skip option of the Maven Install Plugin
  • 将默认工件安装到本地存储库
  • 在 POM 中配置 install-file 目标,以便将其作为构建的一部分(因此无需从命令行手动调用它)

以下配置将提供它:

<properties>
    <library.repository.folder>../libs</library.repository.folder>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <configuration>
                <skip>true</skip>
            </configuration>
            <executions>
                <execution>
                    <id>install-artifact</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>${project.packaging}</packaging>
                        <file>${project.build.directory}/${project.build.finalName}.${project.packaging}</file>
                        <localRepositoryPath>${library.repository.folder}</localRepositoryPath>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

请注意 library.repository.folder 属性 用于指向所需的目标 lib 文件夹(在路径不同的情况下进行更改)。上面提供的配置使用标准的 Maven 属性(用于项目坐标和打包),但您可以根据需要更改它们(或硬编码实际值)。

另请注意,install-file 目标将在 lib 文件夹下重新创建与本地存储库 (lib\groupId\artifactId\version\file.jar) 中相同的文件夹结构。如果您希望将文件直接放在 lib 文件夹 (lib\file.jar) 下,您可以转到以下配置:

<properties>
    <library.repository.folder>../libs</library.repository.folder>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <outputDirectory>${library.repository.folder}</outputDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>

这次我们不使用install-file目标,而是使用Maven Jar Pluginjar目标,将打包的神器直接放置到lib文件夹中(而不是标准 target 文件夹)和包 phase 期间(不是 install)。

如果出于任何原因您想将最终工件保留在目标文件夹中并将其直接复制到 lib 文件夹(没有 Maven 文件夹层次结构)并且在安装阶段,那么您可以移动到以下配置:

<properties>
    <library.repository.folder>../libs</library.repository.folder>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>re-package-into-lib</id>
                    <phase>install</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${library.repository.folder}</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>