14

目标是从存储库中获取最新的tar.gz工件并将其解压缩到某个特定位置。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.5.1</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.enterprise</groupId>
                                <artifactId>skrillex</artifactId>
                                <version>${product.version}</version>
                                <type>tar.gz</type>
                                <outputDirectory>target/product</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

还有

<dependencies>
    <dependency>
        <groupId>com.enterprise</groupId>
        <artifactId>skrillex</artifactId>
        <version>${product.version}</version>
        <type>tar.gz</type>
    </dependency>
</dependencies>

但我们得到错误:

[INFO] --- maven-dependency-plugin:2.5.1:unpack (unpack-unix) @ ... ---
[INFO] Configured Artifact: com.enterprise:skrillex:[1.1.70,):tar.gz
Downloading: https://repo/com/enterprise/skrillex/[1.1.70,)/skrillex-[1.1.70,).tar.gz

...

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-dependency-plugin:2.5.1:unpack (unpack-unix) on project ...: Unable to resolve artifact. Could not transfer artifact com.enterprise:skrillex:tar.gz:[1.1.70,) from/to ext (repo....): IllegalArgumentException
4

4 回答 4

14

注意:以下内容未经测试,但应该可以工作

好的,这里的问题是<artifactItem>不能解决版本范围。

你需要做的是从切换dependency:unpackdependency:unpack-dependencies

例如

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.5.1</version>
        <executions>
            <execution>
                <phase>generate-resources</phase>
                <goals>
                    <goal>unpack-dependencies</goal>
                </goals>
                <configuration>
                    <includeTypes>tar.gz</includeTypes>
                    <includeArtifactIds>skrillex</includeArtifactIds>
                    <outputDirectory>target/product</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

(对于其他任何人,您需要添加依赖项以确保您指定类型,例如

<dependencies>
    <dependency>
        <groupId>com.enterprise</groupId>
        <artifactId>skrillex</artifactId>
        <version>${product.version}</version>
        <type>tar.gz</type>
    </dependency>
</dependencies>

)

这应该确保 Maven 解析范围,并且由于文件类型与类路径不兼容,因此依赖项无论如何都不会位于该工件的传递类路径上。

如果您使用类路径兼容的依赖项执行此操作,例如.jar依赖项,或者可以这样处理的依赖项,例如 a中的.zip依赖项,.war那么您可能希望将其中一个<scope>test</scope>或添加<optional>true</optional>到依赖项中,以便传递依赖项树不会被污染.

潜在问题

您需要注意以下几点:

  • Maven 2.x 不会跟踪远程存储库中的副工件存在,因此如果.tar.gz没有附加到每个版本(或更关键的是每个-SNAPSHOT版本),那么您最终可能会找不到工件

  • Maven 3.x 确实跟踪了副工件的存在,maven-metadata.xml但 IIRC 仅适用于-SNAPSHOT版本,其想法是,如果您部署“部分”快照,您仍然可以解决所有最新的副工件(即使最新的是针对-SNAPSHOT相同的旧版本)版本

  • 使用版本范围是一个非常糟糕的计划。随着范围根据上游的更新设置得到解决,它将给项目的下游消费者带来痛苦的世界<repositories>。请重新考虑并使用固定版本。

于 2013-06-06T16:11:29.263 回答
4

如果您不介意两步过程,请使用以下 pom:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.enterprise</groupId>
<artifactId>skrillex-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
    <skrillex.version>[0.0.0,1.0.0)</skrillex.version>
</properties>
<packaging>jar</packaging>
<build>
  <plugins>
    <plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>versions-maven-plugin</artifactId>
     <version>2.0</version>
     <configuration>
            <includes>
                    <include>com.enterprise:*</include>
            </includes>
     </configuration>
   </plugin>
   <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.5.1</version>
        <executions>
            <execution>
                <phase>generate-resources</phase>
                <goals>
                    <goal>unpack</goal>
                </goals>
                <configuration>
                    <artifactItems>
                        <artifactItem>
                            <groupId>com.enterprise</groupId>
                            <artifactId>skrillex</artifactId>
                            <version>${skrillex.version}</version>
                            <type>jar</type>
                            <outputDirectory>target/product</outputDirectory>
                        </artifactItem>
                    </artifactItems>
                </configuration>
            </execution>
        </executions>
    </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>com.enterprise</groupId>
        <artifactId>skrillex</artifactId>
        <version>${skrillex.version}</version>
    </dependency>
</dependencies>

并首先运行:(mvn versions:resolve-ranges它使用属性中所需的版本更新您的 pom)

其次是您想要的 Maven 目标,例如:mvn install

现在,如果你想要原来的 pom 回来:mvn versions:revert

于 2013-05-29T06:05:44.453 回答
1

这是 maven 依赖插件中的已知问题:http: //jira.codehaus.org/browse/MDEP-50

一般来说 - 没有人喜欢变量依赖版本。我建议根本不要使用它们。您的产品有自己的版本。您产品的特定版本取决于 skrillex 库的特定版本。因此,将其一成不变并接受该版本。

或者使用 Aukjan 提出的解决方案和双 maven 调用。据我所知,没有办法强制 maven 重新加载 pom,因此您将无法在单个 maven 调用中执行此操作。请注意:如果更改 skrillex 库中的 API,您最终可能会导致构建损坏。

于 2013-05-29T12:53:18.647 回答
0

只需在您的 settings.xml 或 mvn -U 中输入 updatePolicy 'always'。这将解决您的问题:

      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </snapshots>
      <releases>
        <updatePolicy>always</updatePolicy>
      </releases>
于 2015-03-25T17:31:54.240 回答