可以使用 maven 但不使用 gradle 通过 artifactory 解决依赖关系吗?
Can resolve dependency via artifactory using maven but not using gradle?
我在使用 gradle 通过人工制品解决依赖性时遇到问题。但我可以使用 maven 解决该依赖关系,所以我不确定我做错了什么。
maven 构建文件是:
<dependencies>
<dependency>
<groupId>org.geoserver</groupId>
<artifactId>geoserver</artifactId>
<version>2.5.1</version>
<type>war</type>
</dependency>
</dependencies>
<repositories>
<repository>
<name>libs-releases</name>
<url>http://<artifactory-host>/artifactory/libs-releases</url>
</repository>
</repositories>
我可以确认 maven 将解决依赖关系:
$ mvn dependency:resolve
Downloading: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom
Downloading: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/web/2.5.1/web-2.5.1.pom
Downloading: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.war
[INFO] The following files have been resolved:
[INFO] org.geoserver:geoserver:war:2.5.1:compile
我的 gradle 构建脚本是:
repositories {
mavenCentral()
maven { url 'http://<artifactory-host>/artifactory/libs-releases' }
}
dependencies {
compile 'org.geoserver:geoserver:2.5.1@war'
}
但是 gradle 不会解决依赖关系:
$ gradle dependencies
:dependencies
compile - Compile classpath for source set 'main'.
\--- org.geoserver:geoserver:2.5.1 FAILED
我已经清理了本地存储库和缓存,以确保解决依赖关系。如果我打开调试输出,我可以看到有针对 POM 文件的 HTTP 请求,但没有针对 WAR 文件的 HTTP 请求。
[DEBUG] [org.apache.http.impl.conn.DefaultClientConnection] Sending request: HEAD /artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom HTTP/1.1
[DEBUG] [org.apache.http.impl.conn.DefaultClientConnection] Receiving response: HTTP/1.1 200 OK
我可以直接下载 POM 和 WAR 文件,所以这不是工件不存在的问题,也不是代理问题或身份验证问题:
$ wget http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom
`geoserver-2.5.1.pom' saved [32283/32283]
$ wget http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.war
`geoserver-2.5.1.war' saved [60164745/60164745]
我看不出我做错了什么。这可能很简单?
edit #1 我在 artifactory 中添加了对 JAR 文件的依赖,解决后没有错误。然后我在 artifactory 中添加了对另一个 WAR 文件的依赖,它也没有错误地解决了。但由于某种原因,原始地理服务器 WAR 依赖项在使用 Maven 时解析,但在使用 gradle.
时不解析
编辑 #2 我在使用 Maven 构建时看到以下警告:
[WARNING] The POM for org.geoserver:geoserver:war:2.5.1 is invalid, transitive dependencies (if any) will not be available: 2 problems were encountered while building the effective model for org.geoserver:geoserver:2.5.1
[ERROR] Invalid packaging for parent POM org.geoserver:geoserver:2.5.1, must be "pom" but is "war" @
[FATAL] The parents form a cycle: org.geoserver:geoserver:2.5.1 -> org.geoserver:web:2.5.1 -> org.geoserver:geoserver:2.5.1 @
查看 geoserver 2.5.1 源代码:
org.geoserver:geoserver
(WAR) 有父级 org.geoserver:web
(POM)
org.geoserver:web
(POM) 有父级 org.geoserver:geoserver
(WAR)
所以存在循环依赖,org.geoserver:web
的parent是非POM封装的
但是 Maven 继续下载 WAR 文件,尽管出现 'fatal' 错误:
Downloaded: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.war (58755 KB at 8601.2 KB/sec)
也许gradle对这个问题更严格?
编辑 #3 我更改了依赖项以排除对 org.geoserver:geoserver
:
的 t运行sitive 依赖项
dependencies {
compile('org.geoserver:geoserver:2.5.1@war') {
transitive = false
}
...
但是当我运行 $ gradle dependencies
.
时依赖仍然没有解决
当我 运行 使用此依赖项的任务时出现堆栈溢出错误:
$ gradle bundleArtifacts
:bundleArtifacts
FAILURE: Build failed with an exception.
* What went wrong:
Could not resolve all dependencies for configuration ':compile'.
> Could not resolve org.geoserver:geoserver:2.5.1.
Required by:
<my-project>:1.0-SNAPSHOT
> Could not resolve org.geoserver:geoserver:2.5.1.
> Could not parse POM http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom
> Could not resolve org.geoserver:web:2.5.1.
> Could not parse POM http://<artifactory-host>/artifactory/libs-releases/org/geoserver/web/2.5.1/web-2.5.1.pom
> Could not resolve org.geoserver:geoserver:2.5.1.
...
这表明 gradle 没有考虑 t运行sitive 依赖关系,因为它无法解析 POM 文件,因为循环依赖关系。
我认为这里唯一的解决方案是创建一个包含 org.geoserver:geoserver:2.5.1
WAR 工件的单独工件(例如 ZIP 文件),添加对该 ZIP 文件的依赖项,并创建一个将该 ZIP 文件的内容提取到目标目录的任务。
看起来您正在使用导致此问题的修改过的 pom 文件。
原来的org.geoserver:geoserver模块的包类型是pom,没有父类。这是整个地理服务器项目的父 pom,不应用作依赖项。
org.geoserver:web 也是 pom 类型,作为所有 web 相关模块的父级。
查看了geoserver的geoserver Artifactory server, I could not find any artifacts named geoserver-x.x.x.war
. It seems that someone deployed web archive(war)分布,修改了org.geoserver:geoserver
原来的pom文件,所以可以解决
如果您想继续解决此 war,我建议为其创建一个新的专用 .pom 文件,该文件不会与地理服务器冲突(使用新的 groupId/artifactId)。
我在使用 gradle 通过人工制品解决依赖性时遇到问题。但我可以使用 maven 解决该依赖关系,所以我不确定我做错了什么。
maven 构建文件是:
<dependencies>
<dependency>
<groupId>org.geoserver</groupId>
<artifactId>geoserver</artifactId>
<version>2.5.1</version>
<type>war</type>
</dependency>
</dependencies>
<repositories>
<repository>
<name>libs-releases</name>
<url>http://<artifactory-host>/artifactory/libs-releases</url>
</repository>
</repositories>
我可以确认 maven 将解决依赖关系:
$ mvn dependency:resolve
Downloading: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom
Downloading: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/web/2.5.1/web-2.5.1.pom
Downloading: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.war
[INFO] The following files have been resolved:
[INFO] org.geoserver:geoserver:war:2.5.1:compile
我的 gradle 构建脚本是:
repositories {
mavenCentral()
maven { url 'http://<artifactory-host>/artifactory/libs-releases' }
}
dependencies {
compile 'org.geoserver:geoserver:2.5.1@war'
}
但是 gradle 不会解决依赖关系:
$ gradle dependencies
:dependencies
compile - Compile classpath for source set 'main'.
\--- org.geoserver:geoserver:2.5.1 FAILED
我已经清理了本地存储库和缓存,以确保解决依赖关系。如果我打开调试输出,我可以看到有针对 POM 文件的 HTTP 请求,但没有针对 WAR 文件的 HTTP 请求。
[DEBUG] [org.apache.http.impl.conn.DefaultClientConnection] Sending request: HEAD /artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom HTTP/1.1
[DEBUG] [org.apache.http.impl.conn.DefaultClientConnection] Receiving response: HTTP/1.1 200 OK
我可以直接下载 POM 和 WAR 文件,所以这不是工件不存在的问题,也不是代理问题或身份验证问题:
$ wget http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom
`geoserver-2.5.1.pom' saved [32283/32283]
$ wget http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.war
`geoserver-2.5.1.war' saved [60164745/60164745]
我看不出我做错了什么。这可能很简单?
edit #1 我在 artifactory 中添加了对 JAR 文件的依赖,解决后没有错误。然后我在 artifactory 中添加了对另一个 WAR 文件的依赖,它也没有错误地解决了。但由于某种原因,原始地理服务器 WAR 依赖项在使用 Maven 时解析,但在使用 gradle.
时不解析编辑 #2 我在使用 Maven 构建时看到以下警告:
[WARNING] The POM for org.geoserver:geoserver:war:2.5.1 is invalid, transitive dependencies (if any) will not be available: 2 problems were encountered while building the effective model for org.geoserver:geoserver:2.5.1
[ERROR] Invalid packaging for parent POM org.geoserver:geoserver:2.5.1, must be "pom" but is "war" @
[FATAL] The parents form a cycle: org.geoserver:geoserver:2.5.1 -> org.geoserver:web:2.5.1 -> org.geoserver:geoserver:2.5.1 @
查看 geoserver 2.5.1 源代码:
org.geoserver:geoserver
(WAR) 有父级org.geoserver:web
(POM)org.geoserver:web
(POM) 有父级org.geoserver:geoserver
(WAR)
所以存在循环依赖,org.geoserver:web
的parent是非POM封装的
但是 Maven 继续下载 WAR 文件,尽管出现 'fatal' 错误:
Downloaded: http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.war (58755 KB at 8601.2 KB/sec)
也许gradle对这个问题更严格?
编辑 #3 我更改了依赖项以排除对 org.geoserver:geoserver
:
dependencies {
compile('org.geoserver:geoserver:2.5.1@war') {
transitive = false
}
...
但是当我运行 $ gradle dependencies
.
当我 运行 使用此依赖项的任务时出现堆栈溢出错误:
$ gradle bundleArtifacts
:bundleArtifacts
FAILURE: Build failed with an exception.
* What went wrong:
Could not resolve all dependencies for configuration ':compile'.
> Could not resolve org.geoserver:geoserver:2.5.1.
Required by:
<my-project>:1.0-SNAPSHOT
> Could not resolve org.geoserver:geoserver:2.5.1.
> Could not parse POM http://<artifactory-host>/artifactory/libs-releases/org/geoserver/geoserver/2.5.1/geoserver-2.5.1.pom
> Could not resolve org.geoserver:web:2.5.1.
> Could not parse POM http://<artifactory-host>/artifactory/libs-releases/org/geoserver/web/2.5.1/web-2.5.1.pom
> Could not resolve org.geoserver:geoserver:2.5.1.
...
这表明 gradle 没有考虑 t运行sitive 依赖关系,因为它无法解析 POM 文件,因为循环依赖关系。
我认为这里唯一的解决方案是创建一个包含 org.geoserver:geoserver:2.5.1
WAR 工件的单独工件(例如 ZIP 文件),添加对该 ZIP 文件的依赖项,并创建一个将该 ZIP 文件的内容提取到目标目录的任务。
看起来您正在使用导致此问题的修改过的 pom 文件。
原来的org.geoserver:geoserver模块的包类型是pom,没有父类。这是整个地理服务器项目的父 pom,不应用作依赖项。
org.geoserver:web 也是 pom 类型,作为所有 web 相关模块的父级。
查看了geoserver的geoserver Artifactory server, I could not find any artifacts named geoserver-x.x.x.war
. It seems that someone deployed web archive(war)分布,修改了org.geoserver:geoserver
原来的pom文件,所以可以解决
如果您想继续解决此 war,我建议为其创建一个新的专用 .pom 文件,该文件不会与地理服务器冲突(使用新的 groupId/artifactId)。