1

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

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。)

4

1 回答 1

1

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

  • 通过Maven 安装插件skip的选项禁用默认工件安装到本地存储库
  • 在 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 插件jar的目标,将打包的工件直接放置到文件夹(而不是标准文件夹)和打包期间(不是)。libtargetphaseinstall

如果出于任何原因您希望将最终工件保留在目标文件夹中并将其直接复制到 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>
于 2016-02-26T22:07:56.777 回答