0

これは一日中私を殺しています。私は日食でアンドロイド/Javaに取り組んでいます。

これが私がやりたいことです

  • ライブラリの 1 つを埋め込みたい - 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 に対して、サード パーティに表示されることなく呼び出せるようにしたいと考えています。

私はウェブ全体を検索しましたが、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 ファイルの 1 つを「非表示」にして、引き続きアクセスできるようにすることはできません。

「uberjar」の概念は、単純にすべての jar ファイルを解凍し、すべてのクラス / リソースを 1 つの大きな jar ファイルに追加することです。

残念ながら、jar ファイルへのアクセスを制限する方法を知りません。

于 2013-05-27T15:11:31.573 に答える
1

uber jar は間違ったルートだと思います。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

于 2013-05-29T15:40:40.087 に答える
0

これは Android には当てはまらないかもしれません。なぜなら、Android のクラスローダーがどのように機能するか 100% 確信が持てないからです。しかし、この考えは一般的にJavaで機能するはずです。

それで、あなたがやりたいことは、LogicLibrary 内のクラスが DatabaseLibrary をロードできるようにするクラスローダーを作成することです。One-Jar はその 1 つです: http://one-jar.sourceforge.net/これにより、ある jar を別の jar にパックし、カスタム クラスローダーを使用して「uber」jar 内に jar をロードできます。 . リンクの 1 つに、maven アセンブリを使用してこれを作成する方法の別のリンクがあります。

私はそれを使用していないので、あなたのニーズに合うかどうかはわかりません. しかし、できることは、暗号化された JAR を復号化する独自のクラスローダーを作成するか、署名を検証するか、必要なメカニズムを使用することです。ライブラリをパスワードで保護された zip ファイルに入れて、クラスローダーに解凍させることもできます。カスタム クラスローダーを使用するのが 1 つの方法です。

Maven アセンブリ プラグインを使用すると、単純に 1 つの Jar を解凍し、別の Jar をインクルードしてからパッケージに戻すことができます (その後、カスタム クラスローダーを使用します)。しかし、それはジャーをあまり保護しません...

于 2013-05-29T02:39:25.620 に答える