当前位置: 首页 > 知识库问答 >
问题:

Gradle idea插件排除了其他子项目的传递依赖性

黄成荫
2023-03-14

我有一个具有以下依赖结构的gradle项目:

root
+--- module1
|    \--- 'some:dependency:1.0' (Maven dependency)
|         \--- 'some:transitive:2.1' (transitive dep)
\--- module2
     +--- module1
     +--- exclude 'some:transitive:2.1'
     \--- 'some:other:1.0'
          \--- 'other:transitive:1.1'
configurations.all {
  exclude group: 'some', module: 'transitive', version: '2.1'
}
gradle :module2:test -Dtest.single=SomeTest
-classpath ...:/path/to/jar/some/transitive/2.1/some-transitive-2.1.jar:...
java.lang.IncompatibleClassChangeError: Implementing class
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
  at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
  at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
  at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:875)
  at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:840)
  at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:755)
  at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1171)
  at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1144)
  at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1140)
  at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:299)
  at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:272)
  at org.glassfish.jersey.test.JerseyTest.<init>(JerseyTest.java:142)
  at com.mypackage.rest.SomeTest.<init>(RestServiceTest.java:19)

这是由Jersey和ASM4.1之间的不兼容性引起的(Jersey使用3.3.1,它具有不同的组id),这是从另一个模块提取的传递依赖项。

顺便说一句,我知道Idea13有更好的Gradle集成,但是(a)我们有12的许可证,而且不会很快升级整个开发团队;(b)Idea13在多语Gradle项目(Java/Scala)方面仍然存在一些问题,所以它不符合要求。

共有1个答案

花阳辉
2023-03-14

排除Maven依赖项的所有传递依赖项,但显式添加所有必需的库。除了'some:transitive:2.1'之外,我认为您可以在没有它的情况下运行代码。

group:'some', name:'dependency', version:'1.0' {
    transitive = false
}
// add required transitive libraries here

另外,尝试用最新版本的Gradle运行您的原始代码。

 类似资料:
  • 关于maven和传递依赖排除有几个问题。然而,我不能让它工作。我的pom中有一些依赖项,它们重新打包了一些库,以减小pom的大小。到目前为止,这是成功的。但是当我运行时,这些可传递的依赖项会被写入。类路径文件。尽管它们被排除在外,如以下摘录所示。 Apache Maven 3.3.3(7994120775791599e205a5524ec3e0dfe41d4a06;2015-04-22T13:57

  • 问题内容: 我有一个Eclipse插件项目,它取决于我在Eclipse工作区中拥有的其他项目。在“ Java Build Path”->“ Projects”选项卡下添加项目依赖项,并在“ Order and Export”中选择项目后,我得到了java.lang.NoClassDefFoundError。 我假设其他项目未正确包含在插件中。有谁知道如何解决这一问题? 谢谢,詹姆斯 问题答案: E

  • 我有三个分级模块:ModA模块、ModB模块和ModC模块 ModA依赖于ModB和Spring Web MVC 3.2.6 ModC依赖于Spring Web MVC 4.1.5 我得到了相当多的错误,因为ModA拉进来,使用的是Spring4.1.5而不是3.2.6。由于版本差异和时间,我现在无法将ModA更新到Spring4.1.5。我想做的是将Spring4.1.5从ModA Gradle

  • 我试图从gradle构建中排除嵌套的传递依赖项。依赖结构看起来像 org.apache.beam:beam-sdks-java-core:2.33.0-自定义 我按照gradle exclude的公认解决方案排除了依赖性,但它对我不起作用。 这不排除依赖项。当我将其更改为时,依赖项仍然没有被排除。 关于如何排除这种依赖关系的任何建议?它在旧版本中拉动。

  • 一些stackoverflow帖子暗示我的类路径中有spring-asm的冲突版本。通过gradle依赖分析,我看到我没有spring-asm的多个版本,但我有spring-core的多个版本(版本3.1.4和5.0.2) 我试图排除3.1.4版本,但无法使其工作。我试图在依赖级别和配置级别都排除它。 即使有了上述更改,我仍然在依赖分析输出中发现Spring-Core:3.1.4.Release。

  • Maven插件及其在父pom中定义的依赖项,我不希望我的子pom包含该插件依赖项。 例如,如果有1个父级和100个子级,99个使用该插件并希望在一个子级中排除该插件。 我们如何才能实现这一目标?