2014-04-17 46 views
5

Bu özel soru birkaç kez sorulmuştur, ancak memnuniyetimden değil. Önerilen geçici çözümlerle gerçekten ilgilenmiyorum, ama aslında yapmak istediklerimi nasıl yapacağım.ANT CLASSPATH öğesinin build.xml içinde ayarlanması

Bunun mümkün olmadığı için bunun neden mümkün olmadığı konusunda tatmin edici bir açıklama yapmak isterim ve bunun için bir düzeltme önermeyi teklif edeceğimden, bu kadar basit görünen bir şeyin neden olmadığını anlamak istiyorum. denendi.

Halen kavanoz bir dizi karınca için kullanılabilir olmasını sağlamak için, aşağıdaki yaklaşımlardan biri uygulanmalıdır:

  • CLASSPATH ortam değişkeni eklemek -
  • eklemek belgelerinde "önerilmez" $ANT_HOME/lib veya ~/.ant/lib - yapı ortamında yapılandırma
  • ant çağırma
01 üzerinde -lib parametresini ayarlayın gerektirir

Son seçenek, tercih edileni olarak üzerinde durduğum şeydi, ancak yine de yapıyı çağıran kişi tarafından bazı geliştirme işlemleri gerektiriyor (geliştirme depomda ant sarmalayıcı komut dosyasında yakaladığım). Özellikle

böyle the documentation göre kurulması gerektiğini Schematron Ant görevi çağırmak çalışıyorum:

<taskdef name="schematron" 
classname="com.schematron.ant.SchematronTask" 
classpath="lib/ant-schematron.jar"/> 

ancak bu, saxon üzerinde geçişli bağımlılığı var CLASSPATH üzerinde saxon.jar mevcut olmadan, böylece oluşturma işlemi başarısız olur:

java.lang.NoClassDefFoundError: net/sf/saxon/TransformerFactoryImpl 

ant documentation itself bu ekalır taskdef kendisi olması gerektiğini önermek devam ediyorgirişleri, ama bunu şematron ant-göreviyle boşa çıkarmaya çalıştım.

Önemli sorular, bunu desteklemesi gereken şematron ant görevinin mi olacağı yoksa ant build.xml'in kendi sınıf içinde kendi sınıf yapılandırmasına sahip olması için mi mümkün olmalıdır? Bu insanlar oldukça sık yapmak isteyeceği bir şey sanki

görünüyor ve karınca docs beri kendilerini build.xml kendi içinde alternatif yok şaşırdım CLASSPATH kendileri kullanmayan tavsiye!

cevap

1

Bu, Schematron görevinde bir hata gibi görünüyor. Ant görevinin Saxon XSLT işlemcisini yükleme biçimi, görev kendisi bir alt sınıf yükleyicide olsa bile, sistem sınıf yolunda Saxon'un kullanılmasını gerektirir. İlk bakışta this code in ValidatorFactory başta

mantıklı yeterince görünür: (TransformerFactoryImplTransformerFactory ait Saxon en uygulamasıdır nerede)

private TransformerFactory _factory = TransformerFactoryImpl.newInstance(); 

ama aslında TransformerFactoryImpl içinde kendine ait bir newInstance() yöntemi yüzden bundan newInstance devralınan tanımlamıyor , javax.xml.transform.TransformerFactory sistem özelliğinin değerine göre uygun bir fabrika arayacaktır.Ant görev does set this system property:

System.setProperty("javax.xml.transform.TransformerFactory", 
     "net.sf.saxon.TransformerFactoryImpl"); 

ama TransformerFactory.newInstance() mutlaka Schematron görevi yüklenen classloader üzerinde, sistem classloader bu sınıf için bakacağız.

düzeltme ValidatorFactory hattı 120 değiştirmek olur sadece tüm dinamik arama baypas geçerek doğrudan doğru sınıf örneğini olur

private TransformerFactory _factory = new TransformerFactoryImpl(); 

. Bu düzeltmeyle, düzgün çalışacak şekilde çalışır.

Hatayı geliştiricilere bildirmenizi öneririm, ancak proje özellikle etkin görünmüyor, bu nedenle kendi yerel çatalı yerine yalnızca kendi yerel çatalı yapmalısınız ...

İlgili konular