图书馆破坏了类路径?
A library corrupts classpath?
有一个我从未见过的奇怪问题。
在我的 gradle 项目的依赖项列表中添加 compile 'org.locationtech.spatial4j:spatial4j:0.7'
会导致损坏的 class 路径。当我注释掉那个库和 运行 java -verbose:class -jar sol_backend_full.jar > ok.log
时,它输出 4399 行 class 条目。但是,在 classpath 中的库中,java -verbose:class -jar sol_backend_full.jar > failed.log
仅输出 953 行,其中大部分是 java.lang.*
或 sun.*
.
显然会导致 Error: Could not find or load main class
。
➥ 有没有人遇到过这种奇怪的行为?
当然,我可以用另一个空间库替换那个库,但发生的事情很奇怪。它只发生在这个库中,removing/adding任何其他的都可以。
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。当您创建一个 fat jar 时,java Classloader 无法从您的 fat jar 中加载其他 类,因为它们没有签名。
因此,您不能在不排除签名的情况下创建具有该依赖项的 fat jar。
请参考-
如上面post中提到的,您可以排除像-
这样的签名
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 依赖项排除在 fat jar 之外。
有一个我从未见过的奇怪问题。
在我的 gradle 项目的依赖项列表中添加 compile 'org.locationtech.spatial4j:spatial4j:0.7'
会导致损坏的 class 路径。当我注释掉那个库和 运行 java -verbose:class -jar sol_backend_full.jar > ok.log
时,它输出 4399 行 class 条目。但是,在 classpath 中的库中,java -verbose:class -jar sol_backend_full.jar > failed.log
仅输出 953 行,其中大部分是 java.lang.*
或 sun.*
.
显然会导致 Error: Could not find or load main class
。
➥ 有没有人遇到过这种奇怪的行为?
当然,我可以用另一个空间库替换那个库,但发生的事情很奇怪。它只发生在这个库中,removing/adding任何其他的都可以。
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。当您创建一个 fat jar 时,java Classloader 无法从您的 fat jar 中加载其他 类,因为它们没有签名。
因此,您不能在不排除签名的情况下创建具有该依赖项的 fat jar。
请参考-
如上面post中提到的,您可以排除像-
这样的签名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 依赖项排除在 fat jar 之外。