2012-01-17 19 views
10

Eclipse'in JDT derleyicisi, findType(...) yöntemini, basamaklı derleme yapmanıza olanak veren bir arabirim INameEnvironment sağlar. Merakla, standart JDK derleyici araç setini kullanarak herhangi bir yol olup olmadığını bilmek ister misiniz?javax.tool ile Cascade In-Bellek Derleme

Not, senaryo arası bağımlılıkları şablon dosyası oluşturan sınıflarının bellek derleme yapmak bir şablon motorudur ve bu size bir şablon dosyasını karşılaştı siparişi tahmin edemez, böylece Foo kudreti ilk derlenmiş gerekiyor o ana Bar, zaten derlenmiş olmadan bu nedenle sen Foo 'ın derleme devam etmek başka bir kaynak Bar üretmek ve sırayla ilk önce derlemeye gerek Foo derlenmesi sırasında, yani kaskad derlemesini yapmak için bir mekanizma gerekir: gibi bazı kod aşağıda:

private NameEnvironmentAnswer findType(final String name) { 
    try { 
     if (!name.contains(TemplateClass.CN_SUFFIX)) { 
      return findStandType(name); 
     } 

     char[] fileName = name.toCharArray(); 
     TemplateClass templateClass = classCache.getByClassName(name); 

     // TemplateClass exists 
     if (templateClass != null) { 

      if (templateClass.javaByteCode != null) { 
       ClassFileReader classFileReader = new ClassFileReader(templateClass.javaByteCode, fileName, true); 
       return new NameEnvironmentAnswer(classFileReader, null); 
      } 
      // Cascade compilation 
      ICompilationUnit compilationUnit = new CompilationUnit(name); 
      return new NameEnvironmentAnswer(compilationUnit, null); 
     } 

     // So it's a standard class 
     return findStandType(name); 
    } catch (ClassFormatException e) { 
     // Something very very bad 
     throw new RuntimeException(e); 
    } 
} 

cevap

2

Yorum konuşmamıza dayanarak, cevabın açık olduğunu düşünüyorum: hayır, bunu JDK derleyicisiyle yapamazsınız. Paket istendiğinde size bir kanca verir, ancak belirli bir sınıf bağımlılığı değil. Bildiğim şu ana kadar elde edebilirsiniz olduğunca yakın Hakkında

geçerli: koduyla

Here's a nice article hafıza sınıflarında işlemek için adapte edilmesi gerekmektedir olsa. Özellikle açıkladığınız sorun, JavaFileManager.list(...) yöntemiyle ele alınmıştır. JavaFileObjects'i burada belleğe önbelleğe aldığınız geri döndürmek zorundasınız. Büyük olasılıkla, üzerinde çalıştığınız önbelleğe alınmış sınıfları işlemek üzere değiştirilmiş olsa da, makalede açıklandığı gibi ForwardingJavaFileManager alt sınıfını oluşturmanız gerekecektir.

Bunu bir şey derlemek için kullanabilirsiniz. Hata döndürürse, eksik olanı bulmak için normal ifadeyi kullanın. Eksik olan şeyin kodunu oluşturduktan/derledikten sonra, orijinal kodu derlemeyi tekrar deneyin.

NOT: Bağımlı sınıfın FQN'sini, bir noktada ForwardingFileManager.list (...) içindeki packageName argümanı olarak sorar. Dersi o noktada iade etmeye çalışmadım. Bu işe yaramayabilir çünkü paket uyumsuz olur, ama belki de olur.

+0

JDT'nin 'INameEnvironment.findType()' noktasının anlamı, kaskatlı derlemeyi yapmamı sağlamasıdır, örneğin 'Bar' sınıfına bağlı olan 'Foo' sınıfına sahibim. Ve benim app "Foo" önce derlemek için çalışır "Bar" derlenir, bu nedenle "Foo" derleme sırasında "Bar" kaynak kodunu oluşturmak için bir mantık uygulayabilir ve derlemek ve sonra Foo 'derleme devam edebilirsiniz. ForwardJavaFileManager' ile bu tür şeyler yapılabilir mi? –

+0

Tanımladığım şeyin üzerine bu tür şeyleri uygulayabilirsiniz. Ben de benzer bir şey yapıyorum. Eğer bazı hataları alırsam, neyin eksik olduğunu bulmak için bir regex kullanırım ve bunun için bir saplama üretir/derler. Ama eğer JDT'nin eksik semboller bulmak için derlemenin tam ortasında size kancalar yaptığını söylerseniz, Javac'ın mevcut olduğunu düşünmüyorum. Ya ya önceden, ya da hata ya da 'liste ile anlamanız gerekir ...) '' arama bir paket içindir, bu nedenle eğer belirli bir paket için bir isteğin bir şeyler üretmeniz gerektiği anlamına gelirse, o zaman kaskat derlemesini buraya koyabilirsiniz. – mentics

+0

hmm ... muhtemelen benim gitmem için bir yol değil. B'yi derlediğimde, A'nın eksik olduğunu, yalnızca A sınıfının eksik olduğunu, kaynak kodunun da hazır olmadığını, kaynak kodunun A şablon dosyasından [a] çıkması gerektiğini buldum. JDT'nin 'findType' çağrısı ihtiyaçları için mükemmel uyuyor. –

1

Sorununuzu çözüp çözmediğini görmek için bu HelloWorld örneğini okumaya çalışın. Kodu yayınlamadan, özel sorununuzun ne olduğunu söylemek zor.

+0

İşte durum. Derlenecek 2 karakterlik kaynak kodunuz olduğunu varsayalım. Biri "paket foo; public class One {...}", diğeri ise "package bar; import foo.One; public class Two {...}" dir. İkinci sınıf "İki" yi derlemeye başlayana kadar her şey yolunda. Derleyici bu foo.One bulunamadığını bildirir. –

+0

Anladım. Bunu bırakıp daha iyi bir çözüm bulmaya çalışacağım. Bir çeşit URL classloader'a ihtiyacınız var gibi geliyor. –

+0

Bu yüzden standart güneş JDT derleyicisinden vazgeçtim ve ECJ ile bitiyorum. Yeni bulguların var mı? –