2012-04-16 20 views
35

Hola Estoy usando un archivo de configuración de src/main/resources en mi aplicación java. Estoy leyendo en mi clase como esta:Recurso de src/main/resources no encontrado después de construir con maven

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

Así que ahora estoy construyendo con esta experta en el uso de mvn assembly:assembly. Aquí está el bit para que en mi pom.xml:

<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> 

Así que cuando corro mi aplicación me sale este error:

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

Pero cuando hago clic derecho en mi frasco ensamblado puedo verlo adentro, ¿alguien sabe lo que estoy haciendo mal?

Respuesta

70

Recursos de src/main/resources será puesto en la raíz de la ruta de clases , por lo que necesita para obtener el recurso como:

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

puede verificar mirando el archivo JAR/WAR producido por experto, que encontrará config.txt en la raíz de su archivo.

+0

¿Podría agregar un pequeño texto a su respuesta explicando qué hizo Maven que causa esta diferencia? Eso podría resultar de gran ayuda. Gracias. – theJollySin

+2

Como se dijo, Maven coloca recursos de 'src/main/resources' en la raíz del classpath, por lo que no hay un directorio' src/main/resources' en el archivo JAR, del mismo modo, los archivos '.class' no están en un directorio llamado 'src/main/java'. ¿Tiene sentido? – beny23

+7

Si se encuentra en un contexto estático, también puede usar "Thread.currentThread(). GetContextClassLoader()" en lugar de "getClass()". –

11

FileReader lee de los archivos en el sistema de archivos.

Tal vez la intención de usar algo como esto para cargar un archivo de la ruta de clase

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

o usted podría extraer el archivo de la jarra antes de leerlo.

+0

src/main/resources no funciona, ya que se copiarán en la carpeta de destino/clases y se empaquetarán en el contenedor. – khmarbaise

+0

Lo he corregido. Gracias. Funciona si tienes '.' en tu ruta de clases pero por las razones equivocadas. es decir, lee el original en lugar de la copia. –

+0

@ beny23 Eso puede ser más simple que usar 'getClassLoader()' que siempre mira el nivel raíz/superior. –

5

Los recursos que ponen en src/main/resources serán copiados durante el proceso de construcción para apuntar/clases que se pueden acceder usando:

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

Necesitará 'getClass()' ya que 'this' es poco probable que sea del tipo' Class'. – beny23

+1

Por supuesto que tienes razón. – khmarbaise

1

Creo que el complemento de ensamblaje pone el archivo en la ruta de la clase. La ubicación será diferente en el JAR que lo que ve en el disco. Desempaquete el archivo JAR resultante y observe dónde se encuentra el archivo allí.

+0

El ejemplo de beny32 es el enfoque correcto. –

Cuestiones relacionadas