首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以通过手工使用maven而不是使用gradle来解析依赖吗?

可以通过手工使用maven而不是使用gradle来解析依赖吗?
EN

Stack Overflow用户
提问于 2016-01-11 02:06:43
回答 1查看 2.8K关注 0票数 1

我在通过使用gradle的工件来解决依赖时遇到了问题。但是我可以使用maven解决这个依赖,所以我不知道我做错了什么。

maven构建文件是:

代码语言:javascript
复制
<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将解决依赖关系:

代码语言:javascript
复制
$ 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构建脚本是:

代码语言:javascript
复制
repositories {
  mavenCentral()
  maven { url 'http://<artifactory-host>/artifactory/libs-releases' }
}

dependencies {
  compile 'org.geoserver:geoserver:2.5.1@war'
}

但是gradle不会解决依赖关系:

代码语言:javascript
复制
$ gradle dependencies
:dependencies

compile - Compile classpath for source set 'main'.
\--- org.geoserver:geoserver:2.5.1 FAILED

我清理了本地存储库和缓存,以确保解决依赖关系。如果打开调试输出,我可以看到POM文件有HTTP请求,但WAR文件没有HTTP请求。

代码语言:javascript
复制
[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文件,所以它不存在工件、代理问题或身份验证问题:

代码语言:javascript
复制
$ 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 --我在工件中添加了JAR文件的依赖项,这解决了没有错误的问题。然后,我在工件中添加了对另一个WAR文件的依赖,该文件也没有错误地解决。但出于某种原因,原始的geoserver WAR依赖在使用maven时解决,而在使用gradle时解决。

编辑#2我在使用maven构建时看到以下警告:

代码语言:javascript
复制
[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文件,尽管存在这个“致命”错误:

代码语言:javascript
复制
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 i更改了依赖项以排除org.geoserver:geoserver上的传递依赖关系

代码语言:javascript
复制
dependencies {
  compile('org.geoserver:geoserver:2.5.1@war') {
    transitive = false
  }
  ...

但是,当我运行$ gradle dependencies时,这个依赖仍然没有解决。

当我使用此依赖项运行任务时,会出现堆栈溢出错误:

代码语言:javascript
复制
$ 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文件,因为循环依赖。

我认为这里唯一的解决方案是创建一个包含org.geoserver:geoserver:2.5.1 WAR工件的单独工件(例如ZIP文件),添加对该ZIP文件的依赖,并创建一个将该ZIP文件的内容提取到目标目录的任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-11 11:53:39

看起来您使用的是修改后的pom文件,这导致了这个问题。

原始org.geoserver:geoserver模块的包类型是pom,它没有父级。这是整个geoserver项目的父pom,不应用作依赖项。

org.geoserver:web也是pom类型,并充当所有web相关模块的父级。

查看geoserver Artifactory服务器,我找不到任何名为geoserver-x.x.x.war的工件。似乎有人部署了geoserver的web档案 (war)发行版,并修改了org.geoserver:geoserver的原始pom文件,以便对其进行解析。

如果您想继续解决这场战争,我建议为它创建一个新的专用.pom文件,它不会与geoserver冲突(使用一个新的groupId/artifactId)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34713179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档