2013-02-14 129 views
5

我的maven工件被部署到Nexus快照存储库。在那里,它被存储在正确的目录,但它的文件名有以下模式:Maven:为什么工件文件名中缺少-SNAPSHOT后缀?

mylibrary-1.0-20130213.125827-2.jar 

然而,Maven的无法下载该快照。根据错误日志,Maven的似乎期待以下文件名:

mylibrary-1.0-SNAPSHOT.jar 

这些都是在我的POM库设置:

<repositories> 
    <repository> 
     <id>mycompany-all</id> 
     <url>https://servername/nexus/content/groups/mycompany/</url> 
    </repository> 
</repositories> 

<distributionManagement> 
    <repository> 
     <id>mycompany-releases</id> 
     <url>https://servername/nexus/content/repositories/releases/</url> 
    </repository> 
    <snapshotRepository> 
     <id>mycompany-snapshots</id> 
     <url>https://servername/nexus/content/repositories/snapshots/</url> 
    </snapshotRepository> 
</distributionManagement> 

注:承上启下组中同时包含releasessnapshots回购。

我没有配置这些回购settings.xml - 是这样的问题?还有什么我做错了?

+1

你说“* Maven似乎期望... *”。当您按照我的建议并参考'mylibrary-1.0-20130213.125827-2.jar'作为'mylibrary-1.0-SNAPSHOT'时,你会得到一个错误吗? – 2013-02-14 11:33:13

回答

5

我把它通过将仓库到settings.xml这样的工作:

<repositories> 
    <repository> 
     <id>mycompany-releases</id> 
     <url>https://servername/nexus/content/repositories/releases/</url> 
     <releases><enabled>true</enabled></releases> 
     <snapshots><enabled>false</enabled></snapshots> 
    </repository> 
    <repository> 
     <id>mycompany-snapshots</id> 
     <url>https://servername/nexus/content/repositories/snapshots/</url> 
     <releases><enabled>false</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </repository> 
</repositories> 

然后,快照jar文件被下载就好了。我怀疑,当Maven知道它处理快照回购时,它会尝试使用和不使用uniqueVersion(请参阅Duncan Jones的回答)。

请注意,在我们的情况下,这些块必须复制为pluginRepositories,因为我们有自定义的Maven插件。

+1

实际上,maven读取/com/mycompany/mylibrary/1.0-SNAPSHOT文件夹中的maven-metadata.xml。这个xml告诉maven它应该使用什么最新的时间戳和内部版本号。然后,Maven转向并构建针对该特定独特版本的请求。如果Maven找不到maven-metadata.xml,就像没有快照库一样,它会发出一个请求--SNAPSHOT版本来查看它是否在那里。 – 2013-02-14 14:17:30

13

您发布的模式(mylibrary-1.0-20130213.125827-2.jar)是一个独特的快照版本。 Maven的3强迫你使用这种类型的神器命名的,但在Maven的2它可以用一个声明预防诸如:

<distributionManagement> 
    ... 
    <snapshotRepository> 
    ... 
    <uniqueVersion>false</uniqueVersion> 
    </snapshotRepository> 
    ... 
</distributionManagement> 

要在项目中使用特定的快照,其声明为:

<dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>mylibrary</artifactId> 
    <version>1.0-20130213.125827-2</version> 
</dependency> 

要使用最新的已知快照,声明它“旧式”:

<dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>mylibrary</artifactId> 
    <version>1.0-SNAPSHOT</version> 
</dependency> 

您可能会发现这个问题的答案similar question有帮助。