2012-04-16 13 views
35

Merhaba java uygulamasında src/main/resources dosyasından bir yapılandırma dosyası kullanıyorum. Yani şimdimaven ile oluşturulduktan sonra src/main/resources kaynağından bulunamadı

new BufferedReader(new FileReader(new File("src/main/resources/config.txt"))); 

Ben maven mvn assembly:assembly kullanarak bu inşa ediyorum: Bu gibi benim sınıfında okuyorum. Uygulamamı çalıştırdığınızda

<plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.3</version> 
       <configuration> 
        <finalName>TestSuite</finalName> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <archive> 
         <manifest> 
          <addClasspath>true</addClasspath> 
          <mainClass>com.some.package.Test</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 

Bu yüzden bu hatayı alıyorum:

src\main\resources\config.txt (The system cannot find the path specified) 

Ama şu benim monte kavanoz tıkladığında bunu görebiliyorum İşte benim pom.xml'Bu bunun için biraz içeride kimse yanlış yaptığımı biliyor mu?

cevap

70

Kaynaklar:

+0

Maven'in bu farklılığa yol açtığını açıklayan cevabınıza biraz metin ekleyebilir misiniz? Bu büyük bir yardım olurdu. Teşekkürler – theJollySin

+2

Belirtildiği gibi, Maven 'src/main/resources' kaynaklarını sınıf yolunun köküne koyar, bu yüzden JAR dosyasında 'src/main/resources' dizini yoktur - aynı şekilde' .class' dosyaları src/main/java 'dizinde bulunmuyor. bu mantıklı mı? – beny23

+7

Statik bir bağlamdaysanız, "getClass()" yerine "Thread.currentThread(). GetContextClassLoader()" öğesini de kullanabilirsiniz. –

11

FileReader, dosya sistemindeki dosyalardan okur.

Belki sınıf yolu

// this will look in src/main/resources before building and myjar.jar! after building. 
InputStream is = MyClass.class.getClassloader() 
        .getResourceAsStream("config.txt"); 

bir dosya yüklemek için böyle bir şey kullanmak için tasarlanmıştır Yoksa okumadan önce kavanozdan dosyayı ayıklamak. sınıf yolunda köküne üzerine konacak src/main/resources den

...this.getClass().getResourceAsStream("/config.txt"); 
+0

src/main/resources, hedef/sınıflar klasörüne kopyalanacak ve jar içine paketlenecek şekilde çalışmaz. – khmarbaise

+0

Bunu düzelttim. Teşekkür ederim. Sınıf yolunuzda ancak yanlış nedenlerden dolayı çalışıyorsa çalışır. yani kopyadan ziyade orijinali okur. –

+0

@ beny23 Kök/üst seviyeye her zaman göz atan 'getClassLoader()' işlevini kullanmaktan daha basit olabilir. –

5

kaynaklar kullanarak erişilebilir/sınıfları hedef oluşturma işlemi sırasında kopyalanacak src/main/kaynaklar koymak Eğer olarak kaynak almak gerekir, böylece:

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt"))); 

Eğer arşiv kök config.txt bulacaksınız gibi maven tarafından üretilen JAR/SAVAŞ dosyasına bakarak kontrol edebilirsiniz.

+4

'getClass()' 'a ihtiyacınız olacak, '' '' '' '' '' '' '' '' 'türünde olması muhtemel değildir. – beny23

+1

Tabii ki haklısınız. – khmarbaise

1

Derleme eklentisinin dosyayı sınıf yoluna yerleştirdiğini düşünüyorum. JAR'da konum, diskte gördüğünüzden farklı olacaktır. Ortaya çıkan JAR'ı paketinden çıkarın ve dosyanın bulunduğu yere bakın.

+0

Beny32'den örnek doğru yaklaşımdır. –

İlgili konular