【问题标题】:Why is Gradle excluding required dependencies?为什么 Gradle 排除了必需的依赖项?
【发布时间】:2016-04-13 04:42:54
【问题描述】:

环境:Linux、Artifactory、Java web 应用程序、带有 Spring 依赖管理插件和 Flyway 插件的 Gradle 2.12。

我们没有使用 Artifactory 插件。我们只是把它当作一个通用的 Maven 存储库。

项目规模庞大,包含 80 到 90 个子项目。我们已经有几个人致力于从 Maven 迁移它,但有很多令人头疼的问题。我们打败了他们中的大多数,但这个特殊的系列结非常接近于让我们沉没。

问题:

  1. 使用--daemon 而不是--parallel,构建速度并不比Maven 快。这似乎很奇怪。分析表明,依赖关系解析需要很长时间。
  2. 构建的某些方面不稳定。这就是说我们在尝试构建时会遇到各种编译器问题。无论我们是否使用--parallel,都会发生这种情况,尽管--parallel 发生的程度更大。无论本地或远程依赖关系如何,它也会发生。我们怀疑它与依赖解决的某些方面有关,或者可能是 Gradle 的意外排除行为的结果。具体来说,我们得到“Class def not found”和/或“missing symbol”。通常这似乎与传递依赖有关。如果我明确地把它放进去,错误就会消失,我会得到一个与不同传递相关的新错误。我已经尝试将它们作为传递和transitive = false 放入。
  3. 使事情复杂化的是,我们有很多 BOM。也许10?有些是我们的,有些属于第 3 方。两个或三个长度超过一页。

没有--parallel,我们似乎无法获得证明迁移合理性所需的性能,但我们或许可以幸存下来并等待--parallel 完成孵化IF 我们可以获得它建立可靠。我们已经在--debug 上骑自行车大约 2 周了,但我们的商店自然对 Groovy 和 Gradle 缺乏经验。

澄清:使用--parallel 大约 30% 的时间可以工作,不使用大约 90% 的时间。如果您构建有问题的特定项目,使用完整的项目路径或更改到该子目录,则构建没有问题。

例如,从--debug 输出中,我看到:

...
-classpath 
/development/.../build/classes/main
/development/.../build/resources/main
/home/someUser/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/4.1.7.RELEASE/8c6c02bcccfa23a74db59f7b7725e69e1af38f04/spring-context-4.1.7.RELEASE.jar
/development/.../build/libs/data-6.7.0-SNAPSHOT.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core/4.2.18.Final/2b4c72104fe1910d368d766243f0d0ac2608e134/hibernate-core-4.2.18.Final.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/joda-time/joda-time/2.8.1/f5bfc718c95a7b1d3c371bb02a188a4df18361a9/joda-time-2.8.1.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/commons-lang/commons-lang/2.6/ce1edb914c94ebc388f086c6827e8bdeec71ac2/commons-lang-2.6.jar
/development/.../build/libs/pnq-orgmanagement-6.7.0-SNAPSHOT.jar
/development/.../build/libs/pnq-stuffmanagement-6.7.0-SNAPSHOT.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/com.pnq/pnq-someutils/6.7.0-SNAPSHOT/642a90ae7cc4f3f9b281184cacbfa1294f176df8/pnq-someutils-6.7.0-SNAPSHOT.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/com.eaio.stringsearch/stringsearch/2/44618501b2fb6b2d1bb851d00b264a6eaf1fc0b0/stringsearch-2.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.bouncycastle/bcprov-jdk15on/1.52/88a941faf9819d371e3174b5ed56a3f3f7d73269/bcprov-jdk15on-1.52.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/commons-collections/commons-collections/3.2.1/761ea405b9b37ced573d2df0d1e3a4e0f9edc668/commons-collections-3.2.1.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.10/4b95f4897fa13f2cd904aee711aeafc0c5295cd8/commons-codec-1.10.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/4.1.7.RELEASE/e52148e9671e2918a2172c9cf56b77bede2042ce/spring-beans-4.1.7.RELEASE.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/commons-validator/commons-validator/1.4.1/2231238e391057a53f92bde5bbc588622c1956c3/commons-validator-1.4.1.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/4.1.7.RELEASE/d8923bdffe631904899875e719d8b363bc3deaea/spring-orm-4.1.7.RELEASE.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.javolution/javolution-core-java/6.2.0rc3/5bae18008a0182d80155dbbe2c91d8907d2496d/javolution-core-java-6.2.0rc3.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/4.1.7.RELEASE/3465a5d3b24006d51482cf45abd13e347f64582a/spring-tx-4.1.7.RELEASE.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.6.1/6f3b8a24bf970f17289b234284c94f43eb42f0e4/slf4j-api-1.6.1.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/com.pnq/pnq-batchutils/6.7.0.2/9c025552239645478a759267748c73f3e1e43a47/pnq-batchutils-6.7.0.2.jar
/development/.../build/libs/pnq-mailutils-6.7.0-SNAPSHOT.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/com.pnq/pnq-utilities/6.7.0.2/d1e8ad707ebd2eddbb29eb0052c05b34acd98b46/pnq-utilities-6.7.0.2.jar
/development/.../build/libs/pnq-database-6.7.0-SNAPSHOT.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/com.twilio.sdk/twilio-java-sdk/3.3.9/133f7bde99aefae1df78ecd9787e5e60bc521ad2/twilio-java-sdk-3.3.9.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.apache.velocity/velocity/1.7/2ceb567b8f3f21118ecdec129fe1271dbc09aa7a/velocity-1.7.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/javax.mail/mail/1.4.1/8b7bc69010655425dabf091b51d1e90b4de36715/mail-1.4.1.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5/a1e6cbb3cc2c5f210dd1310ff9fcb2c09c0d1438/httpclient-4.5.jar
/development/.../build/libs/pnq-infoassembler-6.7.0-SNAPSHOT.jar
/development/.../build/libs/pnq-stufflookup-6.7.0-SNAPSHOT.jar
/home/someUser/.gradle/caches/modules-2/files-2.1/com.pnq/pnq-rcrtrlss/6.7.0-SNAPSHOT/58d6caa20da9035ce7b311f54915448c5bb903dc/pnq-wierdorules-6.7.0-SNAPSHOT.jar
/development/.../build/libs/pnq-cmanagement-6.7.0-SNAPSHOT.jar
/development/.../build/libs/pnq-translation-6.7.0-SNAPSHOT.jar
/development/.../build/libs/pnq-eutilities-6.7.0-SNAPSHOT.jar
/development/.../build/libs/pnq-control-6.7.0-SNAPSHOT.jar
/development/../database/build/libs/test-pnq-database-6.7.0-SNAPSHOT.jar 
...
    14:50:06.439 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.DependencyGraphBuilder] junit:junit is excluded from com.project:project-enterprise-test:6.7.0.2(default).
    ...
        st.java:3: error: package org.junit does not exist
        14:50:06.481 [ERROR] [system.err] import static org.junit.Assert.assertEquals;
        14:50:06.481 [ERROR] [system.err]                        ^

注意:全局搜索显示在 Gradle 构建中的任何位置都没有 junit 的排除项。另外,我在-classpath 中看到了什么不要?朱尼特。 ...但是在相关的build.gradle 文件中我看到了:

testCompile ("com.project:project-enterprise-test")

上面是一个包含Maven依赖的BOM:

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc7</artifactId>
    </dependency>
    <dependency>
      <groupId>org.dbunit</groupId>
      <artifactId>dbunit</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
      <groupId>org.easymock</groupId>
      <artifactId>easymock</artifactId>
      <exclusions>
        <exclusion>
          <groupId>cglib</groupId>
          <artifactId>cglib-nodep</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.hamcrest</groupId>
          <artifactId>hamcrest-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-integration</artifactId>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
    </dependency>
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-all</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
    </dependency>
    <dependency>
      <groupId>org.fitnesse</groupId>
      <artifactId>fitlibrary</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>jsr311-api</artifactId>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-bundle</artifactId>
    </dependency>
    <dependency>
      <groupId>net.sf.dbfit</groupId>
      <artifactId>dbfit</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-jexl</artifactId>
    </dependency>
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>com.springsource.org.apache.commons.io</artifactId>
    </dependency>
    <dependency>
      <groupId>javax.jms</groupId>
      <artifactId>jms</artifactId>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </dependency>
    <dependency>
      <groupId>net.servicefixture</groupId>
      <artifactId>servicefixture</artifactId>
    </dependency>
  </dependencies>

在根build.gradle:

dependencyManagement {
    ...
    imports {
      mavenBom "com.project:project-enterprise-test:$bomversion"
    }
    ...
  }

【问题讨论】:

  • 您是要一次迁移所有内容,还是一次迁移一个子项目?另外,您在构建中遇到了哪些具体的故障?
  • 大爆炸。我们从初始化工具开始。
  • 您必须有解耦的项目才能使并行执行和按需配置正常工作。除此之外,速度并不是 Gradle 优于 Maven 的唯一原因。有力量,灵活性,可读性,......等等。而且速度的提升主要是由于 Gradles 出色的 UP-TO-DATE 检查,因此初始构建可能不会更快,但后续构建应该更快。至少如果你正确配置了你的任务输入和输出,如果使用了守护进程,甚至更多。
  • Gradle 指南将“解耦”定义为在根目录下的 allProjects 和 subProjects 中没有太多东西。我已经把所有可能的东西都搬走了。唯一剩下的就是插件。 Spring 依赖管理、Java 插件和我们的存储库。
  • 速度不是唯一的原因,但它是最好的原因。它直接转化为团队的底线,这使得 Gradle 更容易出售给管理层,以便开发人员可以获得其他原因的回报。 ...也如前所述,我们已经在使用守护进程,但由于某种原因,我们和 Maven 一样慢。有一件事可能是个问题。我们在 test 和 integrationTest 之间有双向构建依赖关系。一段时间以来,我一直试图获得修复的授权。单元测试不应该依赖于 integrationTest。

标签: java spring maven gradle dependencies


【解决方案1】:

如果你不包括,真的很难帮助你

  • 相关build.gradlesn-ps
  • 实际错误

对于依赖版本不匹配,建议大家对比一下 mvn dependency:treegradle dependencyInsight 看看有什么不同。

Maven 和 Gradle 在依赖层次结构中处理同一依赖项的多个版本的方式不同。

  • Maven 使用“最接近定义获胜”策略。
  • 默认情况下,Gradle 会选择最新版本(或者你也可以自定义一个ResolutionStrateegy

【讨论】:

  • 我们做到了。没有不同。 ,,,不完全是。它们是不同的,但所有依赖项都存在。除了不稳定性之外,war 文件构建良好。
  • 我们的方法是先让两个构建尽可能接近,然后修复任何错误。在我们开始尝试解决这些问题之前,它们与我们所能制造的一样。并不意味着我们没有做任何事情,但我们尽了最大努力不去做。我们知道解析策略以及当 Gradle 与 Maven 不匹配时如何强制依赖。
  • 您说“所有依赖项都存在”但它们是相同的版本吗?
  • 依赖管理确保了这种情况。有一些偏差,即 Gradle 正在升级的依赖管理中未提及的传递依赖,但我们通过强制执行 Maven 版本来处理这些。
猜你喜欢
  • 1970-01-01
  • 2017-09-08
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多