2012-05-26 10 views
10

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?

+0

bilmek olabilir? – matts

+0

JavaCompiler (javac), Windows'ta JDK 1.6.30 x64. –

+0

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

cevap

4

Sizin özel JavaFileManager onun list yöntem çağrıldığında elde gerektiğini (Ben sadece yasadışı olacağını beri gerçekten ... "paket" bir paket adı kullanmıyorsanız varsayıyorum). Umarım bu yazım mantıklı ama o yönteme args kombinasyonu bu gibi görünmelidir:

[PLATFORM_CLASS_PATH, some, [CLASS], false] 
[CLASS_PATH, some, [SOURCE, CLASS], false] 
[PLATFORM_CLASS_PATH, some.pkg, [CLASS], false] 
[CLASS_PATH, some.pkg, [SOURCE, CLASS], false] 

Bunun uygun Iterable<JavaFileObject> örneklerini oluşturmak için özel ortamınız için ne kadar zor olacağını emin değilim, ama sanırım Bu gerekli olan şey ...

+0

Paket notu için teşekkürler, sorunu gözden geçirdim. –

+0

Bu işlevi kaçırdım, iyi çağrı.Bu iyi bir yol ancak ben sadece olanları ben derlemek çalışıyorum Java dosyasının asıl derleme kullanılıyor paketindeki tüm sınıfları için JavaFileObject inşa etmek istemiyorum. Sadece paketler değil, gerçek sınıf isimlerini elde etmenin bir yolu var mı? –

+0

İşte bunun için büyük bir uygulamasıdır. http://atamur.blogspot.kr/2009/10/using-built-in-javacompiler-with-custom.html – zeodtr

1

Derleme zamanında sınıflara girmenin güzel bir yolunun Groovy AST Transformation ile olduğunu öğrendim. Sen düz eski java olsa değil Yani here

neler yapılabileceğini de bakabilirsiniz, ancak bir araçtır Ne JDK versiyonu/derleyici ve platform kullanan

İlgili konular