我在使用 gradle 通过 Artifact 解决依赖项时遇到问题。但是我可以使用 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 文件,因此 Artifact 不存在、代理问题或身份验证问题都不是问题:
$ 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]
我看不出我在这里做错了什么。这可能很简单?
编辑#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
的父级具有非 POM 包装。但是,尽管出现了“致命”错误,但 Maven 继续下载 WAR 文件:
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 没有考虑传递依赖,因为它无法解析 POM 文件,因为循环依赖。
我认为这里唯一的解决方案是创建一个单独的 Artifact (例如 ZIP 文件),其中包含
org.geoserver:geoserver:2.5.1
WAR Artifact ,添加对该 ZIP 文件的依赖项,并创建一个任务,将该 ZIP 文件的内容提取到目标目录。
最佳答案
看起来您正在使用导致此问题的修改过的 pom 文件。
原包装类型org.geoserver:geoserver模块是 pom,它没有父级。这是整个 geoserver 项目的父 pom,不应用作依赖项。
org.geoserver:web也是 pom 类型,并作为所有 web 相关模块的父级。
看着geoserver Artifactory server ,我找不到任何名为 geoserver-x.x.x.war
的 Artifact .好像有人部署了web archive (war)geoserver的分发和修改org.geoserver:geoserver
的原始pom文件所以可以解决。
如果您想继续解决这场 war ,我建议为它创建一个新的专用 .pom 文件,该文件不会与地理服务器冲突(使用新的 groupId/artifactId)。
关于maven - 可以通过使用 maven 但不使用 gradle 的 Artifact 来解决依赖关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34713179/