【问题标题】:Maven 2: Only build artifact if not already installed in local repositoryMaven 2:如果尚未安装在本地存储库中,则仅构建工件
【发布时间】:2011-09-07 12:07:15
【问题描述】:

我如何在 Maven 中实现,当从命令行执行“mvn install”时,仅当该工件尚未安装在本地存储库中时才会自动决定构建工件(jar/war)?

我已经尝试过配置文件,这里的问题是在“激活”任务中我无法通过 Maven 属性引用我的本地存储库。我无法对本地存储库进行硬编码,因为这会破坏我在不同环境中的构建。

我还尝试了一种解决方法,方法是在前一阶段触摸文件,例如初始化,然后检查文件是否存在作为激活条件,但这不起作用,因为在执行初始化之前评估了激活条件。

任何提示或想法如何解决这个问题?

谢谢, 彼得

【问题讨论】:

    标签: maven build repository skip artifact


    【解决方案1】:

    简短的回答是:没有理智的方法可以做到这一点,Maven 不能那样工作。

    你可以做的是创建一个 shell 脚本,它首先尝试从本地 repo 解析项目(使用dependency:get),并且只有在第一部分失败时才调用mvn clean install。但问题是您必须在调用中使用项目的确切 groupId、artifactId 和版本,因为这不起作用:

    mvn dependency:get -DrepoUrl=${localRepository} -DgroupId=${project.groupId} \
        -DartifactId=${project.artifactId} -Dversion=${project.version} \
        -Dtransitive=false
    

    不幸的是,变量在项目尚不可用时被扩展。


    因此,唯一好的解决方案是以编程方式进行。编写自定义插件或使用 GMaven 创建一个 groovy 脚本。尝试resolve the project artifact from the repository,如果成功则抛出 MojoFailureException。但它仍然很老套,我就放弃了。

    【讨论】:

      【解决方案2】:

      如果 maven-install-plugin 会有跳过配置,这应该可以使用类似这样的配置文件(也许您必须修改系统属性以使用 m2 存储库获取主目录):

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>foo.bar</groupId>
          <artifactId>lorem-ipsum</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>jar</packaging>
      
          <properties>
              <skip.install>false</skip.install>
          </properties>
      
          <profiles>
              <profile>
                  <id>already-installed</id>
                  <activation>
                      <file>
                          <exists>${env.USERPROFILE}/.m2/repository/foo/bar/${project.artifactId}/${project.version}/${project.artifactId}-${project.version}.${project.packaging}</exists>
                      </file>
                  </activation>
                  <properties>
                      <skip.install>true</skip.install>
                  </properties>
              </profile>
          </profiles>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-install-plugin</artifactId>
                      <version>2.3.1</version>
                      <configuration>
                          <skip>${skip.install}</skip>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      
      </project>
      

      不幸的是 maven-install-plugin 没有跳过配置的可能性。对此有改进请求MINSTALL-73。也许你应该支持这个请求,以便将补丁包含在未来的 maven 版本中。

      所以,正如肖恩·帕特里克·弗洛伊德 (Sean Patrick Floyd) 已经提到的那样,没有“内置”方法可以做到这一点

      【讨论】:

      • 同时上述改进要求已得到实施。
      • 来自最新 maven 的文档:从 Maven 2.0.9 开始,可以插入标签 。支持的变量是 ${user.home} 等系统属性和 ${env.HOME} 等环境变量。请注意,POM 本身中定义的属性和值在此处不可用于插值,例如上面的示例激活器不能使用 ${project.build.directory} 但需要硬编码路径目标。
      • codehaus 关闭后,链接如下:MINSTALL-73
      猜你喜欢
      • 1970-01-01
      • 2018-10-28
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      相关资源
      最近更新 更多