2017-07-21 21 views
0

mavenプロジェクトビルドで作成されたjarファイルの依存関係をすべて一覧表示します。どのように私はこれをjavaで達成できますか?私はmavenコマンドmvn:dependencyを介して知っているが、私はそれをプログラム的にやりたい。 ヘルプ?Jar依存関係の取得方法

+0

'mvn dependency:tree'?プログラム的にどういう意味ですか?どのような目的のために? – khmarbaise

+0

私はjavaで.. jarファイルのパスが与えられている場合、私はその扶養家族のジャー(サードパーティのジャー)を知ることができますか? – NSF

+0

jarファイルは本当に助けにならないでしょう...あなたはpomファイルを持つ必要があります(一般的には、Mavenを使ってjarを構築する場合、pomファイルは通常jarに含まれていますが必ずしもそうではありません)。あなたはこれまでJavaを使って答えましたが、目的は何ですか?どのような問題を達成しようとしていますか? – khmarbaise

答えて

0

一般に、これは困難です。 、

  1. グラブジャーのpom.xmlを空のディレクトリにそれを入れて、「MVN依存関係:リスト」と呼ぶ:あなたは何を行うことができますProcessBuilderを通過。結果を解析すると、依存関係のリストが表示されます。しかし、pom.xmlが独立したプロジェクトのpomとして解釈できない場合(例えば、マルチモジュールビルドの一部である場合)、これは失敗する可能性があります。

  2. ProcessBuilderを使用する代わりに、依存関係のリストを決定するためにAetherを試してみてください。潜在的な問題は上記と同じです。

+0

Aetherの代わりに、移行されたAetherプロジェクトであるhttp://maven.apache.org/resolver/index.htmlを使用してください。 – khmarbaise

0

次のブルートフォース方法では、依存関係(サードパーティ)のすべての絶対パスを正常に取得できます。独自のメソッドで 'FileUtils.getFileListRecursively'と 'FileUtils.readLines'を置き換えます。

FileUtils.getFileListRecursively("src") 

現在のJavaプロジェクトの「SRC」フォルダからの絶対ファイルパスを読み込み、

FileUtils.readLines(filePath) 

はテキストファイルとしてファイルを読み込み、文字列のArrayListのように、すべての行を返します。

HashSet<String> jarLocationsSet = new HashSet<>(); 

    final String importString = "import "; 
    final String javaString = "java"; 
    ArrayList<String> fileList = FileUtils.getFileListRecursively("src"); 
    for (String filePath : fileList) { 
     if (filePath.endsWith(javaString) == false){ 
      continue; 
     } 
     List<String> lines = FileUtils.readLines(filePath); 

     for (String line : lines) { 

      int isecl = line.indexOf(';'); 
      if (line.contains(importString) == false || isecl < 0){ 
       continue; 
      } 
      if (line.contains("static")){ 
       continue; 
      } 
      int start = line.indexOf(importString); 
      line = line.substring(start + importString.length(), isecl); 
      if (line.startsWith(javaString)){ 
       continue; 
      } 
      Class<?> clazz = null; 
      try { 
       clazz = Class.forName(line, false, ClassLoader.getSystemClassLoader()); 
      } catch (Exception e) { 
      } 
      if (clazz == null){ 
       continue; 
      } 


      URL location = clazz.getResource('/'+clazz.getName().replace('.', '/') + ".class"); 
      String locationString = location.toString(); 
      int jarIndex= locationString.indexOf(".jar"); 
      if (jarIndex < 0){ 
       continue; 
      } 
      locationString = locationString.substring(0, jarIndex + 4); 
      jarLocationsSet.add(locationString); 
     } 

    } 


    for (String jarLocation : jarLocationsSet) { 
     System.out.println("jarLocation = " + jarLocation); 
    } 
+0

Edit:このメソッドは、使用されているすべてのjarファイルを取得できますjarファイルが使用されます)。 – Tom

関連する問題