Jar Gradle:控制源集runtimeClasspath属性的顺序

Jar Gradle:控制源集runtimeClasspath属性的顺序,jar,gradle,build.gradle,Jar,Gradle,Build.gradle,我正在尝试学习如何控制在我的源集的runtimeClasspath属性中找到的元素的顺序 原因是我的SourceSet中的一些jar包含重写在其他jar中找到的方法的方法,因此我必须确保重写的jar出现在类路径中被重写的jar之前 目前,我通过直接操作运行时类路径文件集合来实现这一点,但这是一个丑陋而脆弱的解决方案,特别是因为要做到这一点,我必须通过硬编码不同jar的名称和类似内容来明确引用它们。 我更想了解是什么决定了运行时类路径的顺序,看看我是否可以改为对它采取行动 I read forru

我正在尝试学习如何控制在我的
源集的
runtimeClasspath
属性中找到的元素的顺序

原因是我的
SourceSet
中的一些jar包含重写在其他jar中找到的方法的方法,因此我必须确保重写的jar出现在类路径中被重写的jar之前

目前,我通过直接操作
运行时类路径
文件集合
来实现这一点,但这是一个丑陋而脆弱的解决方案,特别是因为要做到这一点,我必须通过硬编码不同jar的名称和类似内容来明确引用它们。 我更想了解是什么决定了运行时类路径的顺序,看看我是否可以改为对它采取行动

I read for
runtimeClasspath
属性表示“执行此源集的类时要使用的类路径”。 在我的
build.gradle
脚本中,我没有看到任何似乎影响
runtimeClasspath
集合中顺序的代码,因此我假设
runtimeClasspath
顺序对应于其
源集中元素的顺序

所以我试图理解是什么决定了
SourceSet
本身的顺序

SourceSet
test
,声明如下:

sourceSets {
    main {
        ....
    }
    test {
        java {
            srcDir 'src/test/java'
        }
    }
}
我添加此代码是为了打印
runtimeClasspath
中的文件列表:

sourceSets.test.runtimeClasspath.each {File file ->
    println file.name
}
假设
SourceSet
只包含2个元素,因此输出为:

thisShouldBeLast.jar
thisShouldBeFirst.jar
我的问题是,我需要将第二个位置的罐子改为第一个位置

我假设
runtimeClasspath
顺序对应于其
SourceSet
中元素的顺序,是否正确?如果是,是什么决定了顺序

====================== 新增示例:

下面是3节课。每个项目都应该独立进行。因此将有3个项目,每个项目只有一个类。项目“Runner”必须将其他2个作为依赖项。 然后运行项目“Runner”(从Eclipse或其他IDE,或在导出JAR后从命令行,或以任何其他方式),给它一个包含项目“原始”和项目“定制”的类路径,并记录输出。然后再次运行它,但在其类路径中颠倒2个项目的顺序,并注意不同的输出

-------------构成项目“原始”的类:-------------


-----------构成“自定义”项目的类:-------------


-------------构成项目“运行者”的类:---------------



======================/p>为什么不排除冲突的依赖项,而不是对类路径排序进行一些糟糕的操作?这将是一个问题,因为问题不仅仅是冲突的依赖项:
thisShouldBeFirst.jar
只覆盖
thisShouldBeLast.jar
的一些方法,它还包含应用程序不需要在任何地方重写的方法。因此,如果我排除整个
thisShouldBeLast.jar
,应用程序将无法工作。而且,我认为依赖类路径顺序并不坏;我把它更多地看作是Java的一个特性,Java的使用被认为是一个好的实践,但实际上我得到越来越多的信息表明依赖类路径顺序是不好的,尽管就我的一生而言,我无法理解类路径顺序怎么可能是开发人员不需要关心的事情——特别是考虑到任何应用程序通常附带的第三方JAR的数量,并且这些JAR很可能包含具有相同限定名的类——但一些来源似乎表明我可能不得不这样做在我理解之前接受这个想法,然后想办法改变我的设计,这样类路径顺序就变得无关紧要了。老实说,这是一个非常有趣的场景。你能提供更多的细节吗?样本项目?一般来说,您只是排除了可传递依赖项和“它起作用”,但在这里它看起来非常复杂。在java/jvm世界中,类路径非常重要,您遇到的问题有一个共同的名称:JARhell。每个java开发人员都有一段时间在那里;]我想到的是,您还可以提供自定义类加载器,而不是对类路径进行排序,您可以在那里修复依赖项。我也宁愿避免这种解决方案。您也可以仅通过依赖项设置顺序。
package testcp;

public class TestCP
{   
    public void show()
    {
        System.out.println("This is from the original JAR, not the customized one.");
    }
}
package testcp;

public class TestCP
{   
    public void show()
    {
        System.out.println("This is from the customized JAR, not the original one.");
    }   
}
import testcp.TestCP;

public class Main
{   
    public static void main(String[] args)
    {
        new TestCP().show();
    }
}