我有一个我在项目中使用的专有依赖项,我无法拒绝。它建在一个大胖子罐子里,里面收集了所有依赖的包裹。我的意思是甚至像slf4j-api,apache-commons,javax包等常见的那些。
将它与我自己的已声明的dependecies列表一起使用是有风险的,因为在classloader中总是会首先加载一个类 - 在fat jar中我的或者过时的类。
我想知道有没有解决这个问题的方法?如何治疗这种肥胖的罐子?我正在使用maven进行依赖管理。
答案 0 :(得分:2)
在Maven中,您在POM中定义依赖关系的顺序非常重要。 如果按正确的顺序列出它们,则应按顺序将它们添加到jar中, 如果文件中的哪个类更高,那就是首先加载的类。
如果您要从多个jar中组合运行时类路径, 再说一遍,这是将罐子放在合适的顺序。
答案 1 :(得分:2)
我认为还有另一种方式。我可以将这个库jar包装在自己的自定义类加载器
中URLClassLoader c1 = new URLClassLoader(new Url[] { new URL("file:lib/fatJarDep.jar"});
创建一个工厂,使用这个独立的类加载器
实例化该库的类Class.forName("className", true, c1);
答案 2 :(得分:1)
如果jar中提取了所有依赖类,则无法将它们从类加载中排除,因此项目中的相同依赖性可能会发生冲突。
您应该编辑胖罐并手动删除类以生成轻型版本,然后将其安装在您的仓库中并在您的pom中引用它。
答案 3 :(得分:1)
如果您知道胖jar的某些功能在您排除某些依赖项时有用,或者您想自己包含它们,可以试试这个: