库会破坏类路径吗?

xt0899hw  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(275)

有个奇怪的问题我从没见过。
添加 compile 'org.locationtech.spatial4j:spatial4j:0.7' 到gradle项目中的依赖项列表会导致类路径损坏。当我注解掉那个库并运行 java -verbose:class -jar sol_backend_full.jar > ok.log 它输出4399行类条目。但是,在classpath中有了这个库, java -verbose:class -jar sol_backend_full.jar > failed.log 输出只有953行,其中大部分是 java.lang.* 或者 sun.* .
这显然会导致 Error: Could not find or load main class .
➥ 有人遇到过这种奇怪的行为吗?
当然,我可以用另一个空间库来代替这个库,但是发生的事情很奇怪。它只发生在这个库中,删除/添加任何其他库都可以。
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
}
hujrc8aj

hujrc8aj1#

jar依赖org.locationtech.spatial4j:spatial4j:0.7是一个有符号的jar。创建fatjar时,java classloader无法从fatjar加载其他类,因为这些类没有签名。
因此,如果不排除签名,就不能创建具有这种依赖性的胖jar。
请参考-gradle-fatjar-无法找到或加载主类
就像上面提到的,你可以排除签名,比如-

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。

相关问题