可以使用 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: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)。