2011-12-19 10 views
8

Tengo una disposición de directorios bastante simple para mi proyecto Maven/Eclipse:¿Cómo puedo obtener un archivo incluido en mi directorio de origen?

. 
├── pom.xml 
└── src 
    ├── main 
    │   ├── java 
    │   │   ├── org 
    │   │   │   └── tkassembled 
    │   │   │    └── maven 
    │   │   │     └── jasperreports 
    │   │   │      └── JasperReportsApplication.java 
    │   │   └── sampleReport.xml 
    │   └── resources 
    └── test 
     ├── java 
     └── resources 

11 directories, 3 files 

Como se puede ver, tengo el archivo sampleReport.xml en la base del directorio de fuentes de Java, pero cuando intento abrir , me sale un FileNotFoundException:

Exception in thread "main" java.io.FileNotFoundException: sampleReport.xml (No such file or directory) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:137) 
    at org.tkassembled.maven.jasperreports.JasperReportsApplication.main(JasperReportsApplication.java:34) 

aquí es mi pom.xml:

<?xml version="1.0"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.tkassembled.maven</groupId> 
    <artifactId>jasperreports-test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>JasperReports Testing</name> 

    <dependencies> 
     <!-- SLF4J --> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.6.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>log4j-over-slf4j</artifactId> 
      <version>1.6.4</version> 
     </dependency> 
     <!-- Logback --> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-core</artifactId> 
      <version>1.0.0</version> 
     </dependency> 
     <dependency> 
      <groupId>ch.qos.logback</groupId> 
      <artifactId>logback-classic</artifactId> 
      <version>1.0.0</version> 
     </dependency> 
     <!-- JasperReports --> 
     <dependency> 
      <groupId>jasperreports</groupId> 
      <artifactId>jasperreports</artifactId> 
      <version>3.5.3</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

y mi aplicación Java aquí:

package org.tkassembled.maven.jasperreports; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.net.URI; 
import java.net.URL; 

import net.sf.jasperreports.engine.JasperCompileManager; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class JasperReportsApplication { 

    private static final Logger logger = LoggerFactory.getLogger(JasperReportsApplication.class); 

    /* 
    * There are basically four steps to a finished product: 
    *  <X> Design a report with a JRXML file. 
    *  <X> Compile the report to a binary, serialized JasperReport and save to disk. 
    *  <X> Fill the compiled report with data. 
    *  <X> Export it. 
    */ 
    public static void main(String[] args) throws Exception { 
     File jrxml = new File("sampleReport.xml"); 
//  URL url = JasperReportsApplication.class.getResource("sampleReport.xml"); 
//  File jrxml = new File(url.getFile()); 
     assert jrxml.exists(); 
     assert jrxml.isFile(); 

     File compileTarget = File.createTempFile("output", "jasper"); 

     FileInputStream jrxmlInput = new FileInputStream(jrxml); 
     FileInputStream jasperInput = new FileInputStream(compileTarget); 
     FileOutputStream jasperOutput = new FileOutputStream(compileTarget); 

//  compile the report 
     JasperCompileManager.compileReportToStream(jrxmlInput, jasperOutput); 

//  lol 

    } 
} 

¿Cómo puedo encontrar este archivo en la raíz de mi directorio de fuentes?

+1

Haga que su programa se ejecute con su código fuente de Java como un directorio de trabajo, pero luego usa '.getResourceAsStream()' justo debajo, ¿por qué dejó de usarlo? – fge

+3

+1 para el árbol ASCII – SLaks

+0

@fge porque devolvió nulo. –

Respuesta

11

Cuando los paquetes de Maven lo pongan en el .jar del proyecto ya no será accesible como File.

Se puede acceder como Stream con

JasperReportsApplication.class.getResourceAsStream("/sampleReport.xml") 

Este archivo debe ser en realidad en el directorio en lugar del directorio src/main/javasrc/main/resources a seguir las convenciones de Maven, es decir, que no es Java código fuente.

+0

Gracias, el "/" precedente era lo que necesitaba. Pensé que se resolvería literalmente, con el sistema de archivos '/'. –

1

Se supone que los archivos que no son de origen están en la carpeta src/main/resources de forma predeterminada.

Cuestiones relacionadas