Java 库破坏了类路径?
有一个奇怪的问题我从未见过 在my gradle项目的依赖项列表中添加Java 库破坏了类路径?,java,gradle,classpath,Java,Gradle,Classpath,有一个奇怪的问题我从未见过 在my gradle项目的依赖项列表中添加编译'org.locationtech.spatial4j:spatial4j:0.7'会导致类路径损坏。当我注释掉该库并运行java-verbose:class-jar sol\u backend\u full.jar>ok.log时,它输出4399行类条目。但是,在类路径中使用该库时,java-verbose:class-jar sol\u backend\u full.jar>失败。log仅输出953行,其中大部分是ja
编译'org.locationtech.spatial4j:spatial4j:0.7'
会导致类路径损坏。当我注释掉该库并运行java-verbose:class-jar sol\u backend\u full.jar>ok.log
时,它输出4399行类条目。但是,在类路径中使用该库时,java-verbose:class-jar sol\u backend\u full.jar>失败。log
仅输出953行,其中大部分是java.lang.
或sun.
这显然会导致错误:无法找到或加载主类
➥ 有人遇到过这种奇怪的行为吗
当然,我可以用另一个空间库来代替这个库,但是发生的事情很奇怪。这只会发生在这个库中,删除/添加任何其他库都可以
所讨论的Gradle版本是5.5.1
,库清单看起来有点长,但一点也不可疑。退回到4.8
也会复制它
以下是构建脚本:
task customFatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'ru.rxproject.sol.backend.BackendApplication',
'Implementation-Version': version + System.getenv('BUILD_NUMBER').toString(),
'Commit-Hash': 'git-' + System.getenv('GIT_COMMIT'),
'Build-Date': java.time.LocalDateTime.now().toString()
}
archiveName = 'sol_backend_full.jar'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
JAR依赖org.locationtech.spatial4j:spatial4j:0.7是一个签名JAR。创建胖jar时,java类加载器无法从胖jar加载其他类,因为这些类没有签名
因此,如果不排除签名,就无法创建具有这种依赖性的胖罐子
请参阅-
就像上面的帖子中提到的,你可以排除以下签名-
jar {
manifest {
attributes "Main-Class": mainClassName
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
exclude 'META-INF/*.RSA'
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
}
但是,我建议不要将jar依赖性放在胖jar中。我不确定是否遵循,但您怀疑spatial4j-0.7。jar
库可能引用了实际不在类路径上的类?嗯,可能是一些常见的api接口。我刚刚尝试了实现
范围,但它仍然破坏了启动:/以下是包含库的失败生成的输出:。以下是成功的一个,库导入已被注释掉:。第二个加载了更多的类。感觉好像有什么东西写了“classpath=null”并破坏了构建。但我从来没有遇到过这样的问题。如果你能告诉我怎么做,我很乐意提供更好的日志@Xobotun更新了答案,这个问题解决了吗?我从来没有听说过有签名的JAR。谢谢你教我他们的存在是的,我计划将所有依赖项移出胖罐子,但不是很快。有道理,java
不想启动我的fat jar,因为它与签名不匹配。再次感谢你,它像一个魅力!