maven - 可以通过使用 maven 但不使用 gradle 的 Artifact 来解决依赖关系吗?

标签 maven gradle artifactory

我在使用 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/

    相关文章:

    安卓工作室 : Gradle build fails -- Execution failed for task ':compileDebugAidl'

    java - 在Intellij中删除和重新导入项目

    jenkins - 如何在 Jenkinsfile 中将 Artifactory DiscardOldBuilds 设置为 true?

    docker - 解码内容错误 : invalid character '<' looking for beginning of value

    Jenkins - 从 Artifactory 下载并计算出的 MD5 校验和与原始值不同

    maven - 我可以将快照的时间戳更改为内部版本号吗?

    java - 为什么没有人使用 make for Java?

    android - 重复的属性application @ appComponentFactory

    java - 运行 jar 时项目抛出 IOException(未找到文件)

    java - 由于 org.eclipse.jst.jee.server :<project> missing,Eclipse juno 不会部署到 tomcat 7