2009-10-14 13 views

Odpowiedz

36

Metoda javax.tools.JavaCompiler#getTask() przyjmuje parametr options, który pozwala ustawić opcje kompilatora. Poniższy message opisuje w prosty sposób ustawić je w celu uzyskania dostępu do programu wywołującego za ścieżkę klas:

być konieczne skonfigurowanie standardowego menedżera plików java wiedzieć o plików (s) JAR - użyć kompilatora Argument opcji, aby to zrobić.

Domyślnie kompilator Javy obiekt tylko wydaje się wiedzieć o domyślne lokalizacje dla bootclasspath, extdirs i endorseddirs katalogi w kategoriach jego ścieżce klasy.

Trzeba dodać bieżącej ścieżki klasy programu wywołującego do kompilatora Javy instancji, który zostanie przeniesiony na standardowego menedżera plików, który będzie następnie znaleźć zajęcia w plikach jar.

Oto jak to zrobić w the compiler wrapper I wrote

List<String> optionList = new ArrayList<String>(); 
// set compiler's classpath to be same as the runtime's 
optionList.addAll(Arrays.asList("-classpath",System.getProperty("java.class.path"))); 

// any other options you want 
optionList.addAll(Arrays.asList(options)); 

JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos); 

Wszystko trzeba wtedy jest uzyskanie odpowiedniego zestawu ścieżce klasy podczas uruchamiania programu wywołującego.

+0

Satheesh pisał to jest odpowiedź: "Czy mógłbyś udostępnić swoje opakowanie kompilatora (link nie działa) z góry dziękuję." –

+0

dziękuję za ten post młyn, walczyłem z tym od wieków i to była odpowiedź ... otuchy :) – flexinIT

+2

BTW, opcja 'classpath'' JavaCompiler' nie "rozumie" symboli wieloznacznych. Więc każdy 'jar' musisz dodać bezpośrednio w tym ciągu. – Andremoniy

2

Ten sam problem przyszedł mi ostatnio, w końcu znalazłem dwa obejścia. Można ustawić ścieżkę klasy albo powołać StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH, "YOUR_CLASS_PATH") lub Compiler.getTask (ARG_0, ARG_1, ARG_2, CLASS_PATH_OPTIONS, podobnie jak pierwsza odpowiedź zamieszczone tutaj mówi.

+0

Aby to działało, musiałem wykonać 'StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH, Arrays.asList (new File (classpath));); –

Powiązane problemy