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

我可以用Gradle强制类路径中的依赖项顺序吗?

司徒瀚
2023-03-14

一个项目在Google App Engine上运行。该项目具有依赖项,该依赖项使用的类由于安全限制而无法在应用程序引擎上调用(它不在白名单上)。我(非常有黑客感)的解决方案是将该类的修改版本复制到我的项目中(匹配原始类的名称和包),而不需要受限类。这在dev和live上都适用,我假设是因为我的源代码出现在外部依赖项之前的类路径中。

为了让它更干净一些,我决定将该类的修改版本放入它自己的项目中,该项目可以打包在一个jar中,并发布给任何其他人,以供他们在遇到此问题时使用。

这是我的build.gradle

// my jar that has 'fixed' version of Class.
compile files('path/to/my-hack-0.0.1.jar')

// dependency that includes class that won't run on appengine
compile 'org.elasticsearch:elasticsearch:1.4.4'

在我的本地dev服务器上,这很好,代码首先在运行时找到我的类的黑客版本。在live上,由于未知原因,首先加载elasticsearch依赖项中的版本。

我知道在类路径中拥有同一个类的两个版本并不理想,但我希望我可以可靠地强制我的版本位于类路径的开头。有什么想法吗?或者,有没有更好的方法来解决这个问题?

共有3个答案

牟嘉
2023-03-14

我应该调查的是应用引擎类加载器,而不是gradle...

App Engine允许您在appengine web中使用少量xml自定义类加载器JAR排序。xml。就我而言:

<class-loader-config>
    <priority-specifier filename="my-hack-0.0.1.jar"/>
</class-loader-config>

这将放置my-hack-0.0.1。jar作为第一个要搜索类的jar文件,不包括目录war/WEB-INF/classes中的类。

...感谢@Danilo Tommasina朝着正确方向的推动:)

2020年更新:

我只是又碰到了同样的问题,遇到了我自己的问题。。。这一次,live appengine正在加载不同版本的org。json被加载到dev中。非常令人沮丧,再多的修改构建脚本也无法修复它。对于未来的搜索者,如果您得到以下信息:

java.lang.NoSuchMethodError: org.json.JSONObject.keySet()Ljava/util/Set;

这是因为它正在加载一个旧的组织。json依赖于上帝知道在哪里。我通过将此添加到appengine网站来修复它。xml:

<class-loader-config>
    <priority-specifier filename="json-20180130.jar"/>
</class-loader-config>

您还需要在构建中使用匹配的依赖项。gradle如果您还没有:

compile 'org.json:json:20180130'
通迪
2023-03-14

根据gradle依赖关系文档,依赖关系的顺序定义了类路径中的顺序。因此,我们可以简单地将库按“依赖项”的正确顺序排列。

但要小心!以下是两条优先级更高的规则:

  • 对于动态版本,“较高”静态版本优先于“较低”版本
司徒俊健
2023-03-14

不太确定这是否是访问此问题的人所寻求的,但这正是我的问题和我达成的解决方案。Jar A:包含类XYZ Jar B:还包含类XYZ我的项目需要Jar B位于类路径上,然后才能编译Jar A。

问题是Gradle根据字母顺序对依赖项进行排序,这意味着Jar B将在生成的类路径中位于Jar A之后,从而导致编译时出错。

解决方案:声明自定义配置并修补compileClasspath。这就是构建的相关部分。gradle可能看起来像。

configurations {
    priority
    sourceSets.main.compileClasspath = configurations.priority + sourceSets.main.compileClasspath
}

dependencies {
    priority 'org.blah:JarB:2.3'
    compile 'org.blah:JarA:2.4'
    ...
}
 类似资料:
  • 我们正在使用Gradle运行一个spring-boot应用程序。 已经通过添加以下内容进行了尝试: 这不起作用。 还增加:

  • 如何告诉Storm使用包含在fat jar中的依赖项而不是Storm类路径中的依赖项? 以下是一些背景/细节: 是中包含的2.0和fat JAR中包含的2.7的依赖项。 使用运行拓扑似乎可以使用2.7。 使用提交拓扑似乎使用2.0而不是2.7。 是使用创建的: 在的依赖项部分下 执行时,会发现2.7的正确joda时间戳 我之所以注意到这一点,是因为我在通过命令提交拓扑时看到以下警告/错误:

  • 我在build.gradle文件中添加了下面的依赖项。Eclipse插件是在build.gradle中添加的。 一旦我运行gradle eclipse命令,所有的compile依赖项都会添加到类路径中,但是testcompile依赖项不会添加到类路径中。

  • 我有一个多项目的构建设置与gradle将包含多个android应用程序和库。 我想应用某些分级插件只对一些子项目。(比如android gradle插件只到android子项目)因此我在和插件声明中添加了类路径依赖项到两个android子项目: 和 。问题是gradle找不到android gradle插件: 错误:(%1,%1)评估项目“:ShopPr:Presentation”时出现问题。找不

  • 我的gradle项目(“osgiapp”)依赖于一个OSGI项目(“osgidep”),该项目具有以下MANIFEST.MF条目: 这里导出了两个包: test.lib包由osgidep.jar中包含的lib/lib.jar提供 test.osgidep包由osgidep.jar本身提供 现在,我的建筑。Gradle看起来是这样的: 当我试图构建使用两个导出包的代码时:

  • 我在 ubuntu 上使用 android studio 1.5.1。我想将谷歌分析添加到我的Android应用程序中。所以我遵循了谷歌分析文档,但是当我将mavenCentral()更改为jcenter()时,Android studio无法解析此类路径: 当我按下“同步项目与Gradle文件`按钮”,Android studio大约需要15分钟,最后说: 错误:连接超时。如果您使用HTTP代理