0

这让我一整天都快要死了。我正在 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 中的所有方法,并将它们暴露给第 3 方。

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

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

maven在jar中嵌入依赖工件代码

但是我对此一无所知,看起来它是 maven 2 的答案,所以也许我需要为 maven 3 做一些不同的事情?

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

4

3 回答 3

1

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

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

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

于 2013-05-27T15:11:31.573 回答
1

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

- 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();
    }
 }

现在你是第 3 方供应商只会看到 LogicClass.doSomething()

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

于 2013-05-29T15:40:40.087 回答
0

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

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

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

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

于 2013-05-29T02:39:25.620 回答