Maven 3“uber jar”如何在罐子里嵌入一个罐子?

时间:2013-05-09 15:31:52

标签: android maven uberjar

这一整天都在扼杀我。 我在eclipse中处理android / java。

这就是我想做的事情

  • 我想嵌入我的一个库 - DatabaseLibrary

  • 在我的另一个库中 - LogicLibrary

至关重要 - 不要将DatabaseLibrary中的任何方法暴露给有权访问LogicLibrary的第三方。


我尝试使用像这样的proguard-maven-plugin包含它

 <configuration>
                <assembly>
                 <inclusions>
                     <inclusion>
                         <groupId>xxx</groupId><artifactId>DatabaseLibrary</artifactId><library>true</library>
                     </inclusion>
                 </inclusions>
             </assembly> 

但是,这包括进入DatabaseLibrary的所有方法并将它们暴露给第三方。

我希望我的LogicLibrary能够在没有第三方看到它的情况下调用DatabaseLibrary。

我在网上搜索过,似乎我需要做的就是一个叫做超级罐子的东西。但是我尝试了一些方法,比如这里提到的maven-assembly-plugin https://stackoverflow.com/a/1834905/1312937

maven embed dependency artifact code in jar

然而,我对此毫无处可去,看起来这是一个maven 2的答案,所以也许我需要为maven 3做些不同的事情?

有谁能告诉我,uberjar是否是我实现目标的正确方法? 如果有其他模式,请告诉我,我没有绑到maven。

3 个答案:

答案 0 :(得分:1)

Java类路径不会像您认为的那样工作。 你无法“隐藏”其中一个jar文件,仍然可以访问它。

'uberjar'概念是简单地解压缩所有jar文件,然后将所有类/资源添加到一个大jar文件中。

不幸的是,我不知道有什么方法可以限制对jar文件的访问。

答案 1 :(得分:1)

我认为超级罐是错误的路线。相反,为了实现从DatabaseLibrary中隐藏方法但让逻辑可以访问它的目标,我会将您的方法声明为“受保护”,这会限制其对包级别的可见性。鉴于你要确保任何需要在jar之间交谈的类都在同一个包中(尽管在单独的jar中)。这将迫使第三方供应商仅使用他们可用的公共方法。

- DatabaseLibrary
  |- com.mycompany
      |- DatabaseClass

-LogicLibrary
  |- com.mycompany
      |- LogicClass


 public class DatabaseClass{
    protected void doSomething(){
    }
 }

 public class LogicClass{
    public void doSomething(){
       DatabaseClass dbClass = new DatabaseClass();
       dbClass.doSomething();
    }
 }

现在,您是第三方供应商,只会看到LogicClass.doSomething()

另请参阅:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

答案 2 :(得分:0)

这可能不适用于Android,因为我不是100%确定Android中的类加载器是如何工作的。但是这个想法应该在Java中起作用。

所以你想要做的就是创建一个类加载器,它允许你在LogicLibrary里面的类加载DatabaseLibrary。解决方案很少,One-Jar就是其中之一:http://one-jar.sourceforge.net/这个允许你将一个jar包装到另一个jar中,然后使用自定义类加载器在“uber”jar中加载jar。在你的一个链接中,有另一个链接如何使用maven程序集创建它。

我没有使用它,所以我不确定它是否适合您的需求。但你可以做的是创建自己的类加载器,它将解密加密的JAR,或验证签名或使用你需要的任何机制。您甚至可以将您的库放入受密码保护的zip文件中,让类加载器解压缩它。使用自定义类加载器是一种方法。

您可以使用maven程序集插件简单地解压缩一个Jar,包含另一个Jar,然后将其打包回来(然后使用自定义类加载器)。但它不会太多地保护罐子......