我有以下build.gradle
脚本:
apply plugin: 'java'
apply plugin: 'maven'
compileJava {
targetCompatibility = "1.8"
sourceCompatibility = "1.8"
options.encoding = 'UTF-8'
}
ext.username = System.getProperty('username') != null ? System.getProperty('username') : mavenUser
ext.password = System.getProperty('password') != null ? System.getProperty('password') : mavenPassword
description = "Example project that shows how to use Gradle to build and deploy artifacts to Nexus"
configurations {
deployerJars
}
repositories {
maven { url "http://nexus:8081/nexus/content/groups/my-group/" }
mavenCentral()
}
dependencies {
deployerJars "org.apache.maven.wagon:wagon-http:2.2"
testCompile group: 'junit', name: 'junit', version: '4.11' …
Run Code Online (Sandbox Code Playgroud) 我想要做的是强制Maven下载我在本地存储库中的每个工件的'maven-metadata.xml'.
默认的Maven行为是仅从远程存储库下载元数据(请参阅此问题).
为什么我要这样做:
目前,我有一个在构建机器中运行的远程存储库.通过远程存储库,我指的是位于构建计算机中的目录,其中包含构建我的Maven项目所需的所有依赖项.请注意,我没有使用像Nexus这样的存储库管理器,存储库只是我上传到构建机器的本地存储库的副本.
但是,由于我的本地存储库不包含"maven-metadata.xml"文件,因此构建计算机存储库中也缺少这些元数据文件.如果我可以从中央存储库检索元数据文件,那么就可以将一个工作的远程存储库上传到我的构建机器.
长时间读者,第一次问问...
我有一个独立的网络(没有互联网接入).它有一个神器服务器,它有虚拟的libs-snapshot和libs-release repos.在libs-snapshot下,有4个本地快照存储库.这样做的原因是我们从其他地方(非连接)获取所有神器回购的转储,并将其导入该网络.但我们必须修改那里的快照工件的子集.所以我们创建了另一个本地快照仓库,称之为mine-snapshot-local(maven 2 repo,设置为唯一,max artifacts = 1?),并将其添加到libs-snapshot virtual 的顶部.从理论上讲,这将允许我们修改我们需要的少量工件,部署到我们自己的仓库,本地开发人员会选择那些.但是我们仍然可以从其他非连接系统的定期转储中访问99%的其他工件.此外,我们可以批量导入来自同时被修改的其他网络的丢弃,而无需触及我们的独立网络仓库(我的快照本地).我想我们正在"分支"神器回购......
我意识到我们可能只是直接部署到其中一个导入的repos中,但是下次我们从另一个网络获得转储时,所有这些自定义修改的工件都会消失...所以我真的很想让这个方法得到如果可能的话.
从我的本地eclipse中,maven插件显式地将工件部署到mine-snapshot-local repo ,并且没有错误.我看到的问题是虚拟libs-snapshot的maven-metadata.xml没有被更新.该文件的时间戳已更新,如果我使用Web浏览器浏览libs-snapshot/whatever_package,我可以看到新部署的工件,其时间戳比现有快照更新.但maven-metadata.xml文件仍包含指向"较旧"快照的指针.
maven-metadata.xml在mine-snapshot-local repo中成功更新,但就好像artifactory没有正确地将所有元数据文件合并到虚拟仓库中.或者,更有可能的是,我错误配置了某些东西导致它忽略了我们的顶层本地仓库(但为什么快照jar/pom仍会显示在那里?).
我们正在使用artifactory 2.6.1(并且没有升级选项).
我尝试了很多方面:将快照存储库设置为唯一的,非唯一的部署程序,限制快照的数量等等.似乎没有任何区别.
我认为可能存在问题的一件事是分配给快照的内部版本号.例如,在导入的repo中,工件的时间戳可能是一周,但是内部版本号为4355.在我的新repo中,当我部署时,我有一个更新的时间戳,但内部版本号为1(或比4355小得多的东西.
我试图拥有这样的多个本地快照存储库,从而咆哮错误的树吗?看起来这应该没问题,但也许不行.
出于某种原因,maven-metadata.xml文件中的"latest"标记在部署其相应工件的新版本时停止更新.在遍布整个互联网之后,我发现很多人都说Maven在运行其部署插件时会生成/更新此文件,但如果这是真的,那么我的maven版本似乎已经停止更新了最新标签.反正是否有强制maven在构建/部署期间更新标记?
在我的构建期间,我看到这些消息,清楚地表明它正在下载maven-metadata.xml,我假设更新它,然后将其上传回服务器:
Downloading: https://<REPO_SERVER>/<ARTIFACT_PATH>/maven-metadata.xml
Downloaded: https://<REPO_SERVER>/<ARTIFACT_PATH>/maven-metadata.xml (955 B at 3.0 KB/sec)
Uploading: https://<REPO_SERVER>/<ARTIFACT_PATH>/maven-metadata.xml
Uploaded: https://<REPO_SERVER>/<ARTIFACT_PATH>/maven-metadata.xml (989 B at 1.5 KB/sec)
Run Code Online (Sandbox Code Playgroud) 由于某些原因(不是本文的关注点),Amazon S3并不是Maven存储库的理想主机。所以我要在本地计算机上构建我的Maven应用程序,并在某些时间点上(例如每两天左右),使用aws s3 cp
命令将整个层次结构复制到Amazon S3 。说我复制com文件夹,就像:
com
-raysis
--rayProduct
---1.0-SNAPSHOT
----rayray.jar
Run Code Online (Sandbox Code Playgroud)
问题是已创建的元数据文件是maven-metadata-local.xml(因为我已经在本地构建了它,这似乎是合理的),但是当我将其上传到S3并尝试通过maven进行获取时,它抱怨说没有maven-metadata.xml。所以我怎么能强制(或优雅地要求)maven创建maven-metadata.xml代替/与maven-metadata-local.xml一起?由于Maven元数据内部没有特定于位置的数据,因此移动似乎不容易。
注意:我正在尝试从S3加载以下依赖项(我也添加了存储库):
<dependency>
<groupId>com.raysis</groupId>
<artifactId>sense-lib</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Run Code Online (Sandbox Code Playgroud) 我正在使用Maven2,我似乎无法在我的存储库中找到任何插件.我得到的错误就像
存储库元数据:'org.apache.maven.plugins'在存储库中找不到:myrepo
其中myrepo是我的存储库的名称.
我的问题是Maven如何知道在哪里找到插件?我的错误中有一个对元数据的引用,预期元数据在哪里以及必须采用什么格式?到目前为止,我没有太多运气寻找文件......
(我对使用中央回购的简单答案不感兴趣,我想知道为什么myrepo不工作.)
谢谢!
我正在使用Maven 3.2.我在我的pom.xml文件中有这种依赖(一个WAR项目)
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>1.6.2</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
每当我为我的pom运行任何阶段(例如"mvn install")时,应用程序总是尝试下载有关依赖关系的一些元数据......
Downloading: http://repo.spring.io/milestone/joda-time/joda-time/maven-metadata.xml
Run Code Online (Sandbox Code Playgroud)
我怎么告诉Maven停止这样做?我已经将神器缓存在我当地的Maven回购中.
谢谢, - 戴夫
我认识到 Maven 并不总是使用最新版本的插件。
例如,org.codehaus.mojo:sonar-maven-plugin
2.7 版本已于 10 月 19 日发布,但在 10 月 23 日,Maven ( mvn sonar:sonar
)仍在使用 2.6 。
我什至记得一些插件,其中最新版本比 Maven 决定使用的版本高出几个小版本。
是否有任何(中央)索引/列表/数据库,Maven 会在其中查找要使用的版本?如果是,在哪里可以手动访问?
我的问题很"简单"但直到现在我才找到解决方案:
我有2个项目.
项目B 依赖于A(使用classifier dev或pro)
我用A分类器(dev)在A上执行安装目标
然后我编译B项目(我把依赖项放到A,用分类器DEV)
它运作良好.
但是当我对artifactory(目标部署)做同样的事情时,它不起作用 (并且存储库配置为"唯一")
它不起作用,因为神器?maven依赖?正试图下载A与分类器dev 和最新时间戳,buildnumber of whatever.
但是这个"逻辑"是错误的,因为最新的时间戳对A分类器pro有效!
我读了本地存储库和artifactory存储库之间的metadata.xml.有类似的(但不完全相同)
我错了什么?多谢你们!
当我尝试在 Eclipse 中构建我的 Maven 项目时,我收到此构建失败消息:
[INFO] Checking for transitive/resolved version mismatches.
[INFO] com.company.etc:artifact-name:
[INFO] required: 1.5
[INFO] resolved: 1.3
Run Code Online (Sandbox Code Playgroud)
我的 POM 文件要求此工件的 1.5 版,因此该部分是正确的。但是在列出的存储库中,版本 1.3、1.4 和 1.5 都可用,根目录中也有正确的 maven-metadata.xml 文件。简单地将我的 POM 文件要求更改为旧版本不是一种选择,因为我需要最新版本的工件中的功能。
我真的被这里难住了。有什么我忽略的可能会导致 Maven解析的版本号低于存储库服务器上实际可用的版本号?
maven-metadata ×10
maven ×8
java ×3
artifactory ×2
maven-2 ×2
nexus ×2
amazon-s3 ×1
artifacts ×1
eclipse ×1
gradle ×1
maven-plugin ×1
plugins ×1
repository ×1
xml ×1