目标是从存储库中获取最新的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
答案 0 :(得分:13)
注意:以下内容未经测试,但应该工作
好的,这里的问题是<artifactItem>
无法解析版本范围。
您需要做的是从dependency:unpack
切换到dependency:unpack-dependencies
e.g。
<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
依赖关系,或者可以被视为依赖关系的依赖关系,例如.zip
中的.war
依赖项然后您希望将<scope>test</scope>
或<optional>true</optional>
添加到依赖项中,以便传递依赖关系树不会受到污染。
您需要注意一些事项:
Maven 2.x不会跟踪远程存储库中的侧工件存在,因此如果.tar.gz
未附加到每个版本(或更严重地每个-SNAPSHOT
版本),那么您可能最终找不到工件
Maven 3.x确实跟踪了maven-metadata.xml
中的侧工件存在,但仅针对-SNAPSHOT
版本跟踪IIRC,其想法是如果部署“部分”快照,您仍然可以解析所有最新的副本文件(即使最新的版本是-SNAPSHOT
较早的版本
使用版本范围是一个非常糟糕的计划。随着范围根据上游<repositories>
的更新设置得到解决,它将给项目的下游消费者带来痛苦的世界。请重新考虑并使用固定版本。
答案 1 :(得分: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
答案 2 :(得分:1)
这是maven依赖插件中的已知问题:http://jira.codehaus.org/browse/MDEP-50
一般来说 - 没有人喜欢变量依赖版本。我建议不要使用它们。 您的产品有自己的版本。您产品的特定版本取决于skrillex库的特定版本。所以把它放在一块石头上并与那个版本一起生活。
或者使用Aukjan提出的双maven调用解决方案。据我所知,没有办法强制maven重新加载pom,所以你无法在单个maven调用中执行此操作。请注意:如果在skrillex库中更改API,您最终可能会破坏构建。
答案 3 :(得分:0)
只需在settings.xml或mvn -U中输入updatePolicy'always'即可。这将解决您的问题:
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<updatePolicy>always</updatePolicy>
</releases>