Makinede bağımlılıklar olmadan kaynak derlemek istiyorum.
Örnek: A.java Dosya:
Özel SınıfLoader ve FileManager ile JavaCompiler
import some.pkg.B;
public class A extends B {...}
Ben B kaynağı bulundurma yok, (söz konusu paketi 'bazı semboller almak için JavaFileManager veya özel ClassLoader ya kanca istiyoruz. paketi 've B sınıfı) ve sonra kaynak dizesini alır bir hizmet kullanın.
derleme kodu: (inputFiles vardır A.java) JavaFileManager üzerinde
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
CustomClassLoader classLoader = new CustomClassLoader();
StandardJavaFileManager standardfileManager = compiler.getStandardFileManager(this, null, null);
JavaFileManager fileManager = new CustomFileManager(standardfileManager, output, classLoader);
CompilationTask task = compiler.getTask(null, fileManager, this, null, null, inputFiles);
boolean result = task.call();
Kancalar (getFileForInput ..) ve benim classloader (findClass, loadClass ..) üzerinde derleme tetiklenir ve ben vermedi JavaCompiler (eski sürüm) ler üzerinden gidiyor, API ile uğraşırken sonra
A.java:#: package some.pkg does not exist
A.java:#: cannot find symbol
symbol: class B
DÜZENLEME
: hata mesajları var ource ve Compilation Overview okuma Ben hala sözdizimi ağaçlarından Semboller sağlamak için kullanabileceğiniz bir API kanca bulamıyorum. API'nın, kschneid tarafından önerilen şekilde paket kaynaklarına dayalı tüm kaynakları alması gerektiği görülmektedir.
Bir çözüm, JavaCompiler'ı çalıştırıyor ve eksik semboller için hata mesajlarını analiz ediyor. Bu şekilde hangi sembollerin gerekli olduğunu bileceğim, onları toplayın ve yeniden derleyin.
Diğer tüm geçici çözümler/çözümler?
bilmek olabilir? – matts
JavaCompiler (javac), Windows'ta JDK 1.6.30 x64. –
Tamamen emin değilim. Ama, yapmaya çalıştığınız şey dinamik sınıf yüklemesiymiş gibi hissediyorum. Sınıfı çalışma zamanında yüklemek için Class.forname() işlevini kullanamazsınız. Yanlış anlaşılırsam lütfen beni düzeltin. – Ankit