gpt4 book ai didi

java - scala (jar) 库的着色依赖关系

转载 作者:行者123 更新时间:2023-12-01 18:12:35 28 4
gpt4 key购买 nike

我想分发我创建的库的 jar,其中捆绑了所有依赖项。但是我想避免与采用项目的依赖项发生版本冲突。

我认为 Maven Shade 可以做到这一点,但我找不到使用 Scala/SBT 做到这一点的方法。我发现 OneJar 但从我的实验来看它似乎只适用于可执行文件。

我怎样才能实现这个目标?

谢谢!

最佳答案

您可以使用自己的类加载器来完成此操作。

类加载器:
编写一个类加载器,使用重写从不同的类加载器加载类文件。

例如,您可以在获取资源时将库添加为类路径的前缀。

我使用这个 teqnuiqe 创建了一个类加载器。 https://github.com/espenbrekke/dependent/blob/master/src/main/java/no/dependent/hacks/PathRewritingClassLoader.java

它用添加前缀的方法替换了 URLClassLoader 中的 findClass 方法。

protected Class<?> findClass(final String name) throws ClassNotFoundException {
Class result;
try {
result = (Class)AccessController.doPrivileged(new PrivilegedExceptionAction() {
public Class<?> run() throws ClassNotFoundException {

// This is where the prefix is added:
String path = PathRewritingClassLoader.this.prefix + name.replace('.', '/').concat(".class");
Resource res = PathRewritingClassLoader.this._ucp.getResource(path, false);
if(res != null) {
try {
return PathRewritingClassLoader.this._defineClass(name, res);
} catch (IOException var4) {
throw new ClassNotFoundException(name, var4);
}
} else {
return null;
}
}
}, this._acc);
} catch (PrivilegedActionException var4) {
throw (ClassNotFoundException)var4.getException();
}

if(result == null) {
throw new ClassNotFoundException(name);
} else {
return result;
}
}

我们还必须重写资源加载

@Override
public URL getResource(String name){
return super.getResource(prefix+name);
}

使用方法如下:

_dependentClassLoader = new PathRewritingClassLoader("private", (URLClassLoader)DependentFactory.class.getClassLoader());
Class myImplementationClass=_dependentClassLoader.loadClass("my.hidden.Implementation");

构建你的 jar:
在您的构建中,您将所有库和私有(private)类放置在您选择的前缀下。在我的 gradle 构建中,我有一个简单的循环来收集所有依赖项。

task packageImplementation {
dependsOn cleanImplementationClasses

doLast {
def paths = project.configurations.runtime.asPath
paths.split(':').each { dependencyJar ->
println "unpacking" + dependencyJar

ant.unzip(src: dependencyJar,
dest: "build/classes/main/private/",
overwrite: "true")
}
}
}

关于java - scala (jar) 库的着色依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841245/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com