如何处理胖jar依赖

时间:2014-12-24 09:23:48

标签: java maven dependency-management

我有一个我在项目中使用的专有依赖项,我无法拒绝。它建在一个大胖子罐子里,里面收集了所有依赖的包裹。我的意思是甚至像slf4j-api,apache-commons,javax包等常见的那些。

将它与我自己的已声明的dependecies列表一起使用是有风险的,因为在classloader中总是会首先加载一个类 - 在fat jar中我的或者过时的类。

我想知道有没有解决这个问题的方法?如何治疗这种肥胖的罐子?我正在使用maven进行依赖管理。

4 个答案:

答案 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的某些功能在您排除某些依赖项时有用,或者您想自己包含它们,可以试试这个:

  1. 制作一个仅依靠胖罐的maven项目
  2. 使用maven-shade-plugin,特别是它的重定位功能来排除您不想要的包,或者只是将所有jar的类重新定位到另一个包中,从而将它们移开。
  3. 在您的其他项目中使用项目的工件而不是脂肪专用jar。