コードを生成してコンパイルするMavenプラグインに取り組んでいます。Eclipse でのテストでプラグインのソース コードを使用している場合、問題なく動作します。JavaCompiler ( Javax.tools ) でクラスパスを設定することさえしません。
しかし、パッケージ化してmavenプラグインとして実行すると。生成されたコードのコンパイルは、Jackson アノテーションなどの参照されたクラスを見つけることができずに失敗します。
私は試した
- ローカルの Maven リポジトリを指す JavaCompiler で classpath オプションを設定しようとしましたが、それでも必要なクラスが見つかりませんでした。
- クラスパスを jackson アノテーション jar と commons lang (生成されたコードで必要) に設定すると、問題なく動作するようです。
作業コード:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler
.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager
.getJavaFileObjects(classDirectory.listFiles());
List<String> optionsList = new ArrayList<String>();
System.setProperty("java.class.path", "/Users/vayipalayamchand/.m2/maven.repo:../..");
optionsList.addAll(Arrays.asList("-classpath","/Users/vayipalayamchand/.m2/maven.repo/com/fasterxml/jackson/core/jackson-annotations/2.1.0/jackson-annotations-2.1.0.jar:/Users/vayipalayamchand/.m2/maven.repo/commons-lang/commons-lang/2.4/commons-lang-2.4.jar:../../:$CLASSPATH"));
JavaCompiler.CompilationTask task = compiler.getTask(null,
fileManager, diagnostics, optionsList , null, compilationUnits);
boolean isSuccess = task.call();
fileManager.close();
jar アプローチへのパスを使用したこの設定クラスパスの問題:
- きれいではありません。プラグインのユーザーは、これらの jar の場所を指定する必要があります (これをオプションとして数えることさえしません。
JavaCompiler が、生成されたコードをコンパイルするために必要な依存関係を見つけることができることを確認するためのより良い方法は何ですか。
どんな助けでも大歓迎です。