2011-12-19 51 views
8

我有一个非常简单的目录布局Maven的我/ Eclipse项目:如何获取包含在我的源代码目录中的文件?

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

11 directories, 3 files 

正如你所看到的,我已经得到了sampleReport.xml文件中的Java源代码目录的基础上,但是当我尝试打开它,我得到一个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) 

这里是我的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> 

这是我的Java应用程序:

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 

    } 
} 

如何在我的源代码目录的根目录找到这个文件?

+1

使您的程序以您的Java源代码作为工作目录运行 - 但是您在下面使用'.getResourceAsStream()',为什么您不再使用它? – fge 2011-12-19 20:54:55

+3

ASCII树 – SLaks 2011-12-19 20:55:00

+0

@fge,因为它返回null。 – 2011-12-19 21:14:41

回答

11

当Maven将它包装到项目的.jar中时,它将不再作为File访问。

它可以作为一个Stream访问与

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

这个文件实际上应在src/main/resources目录,而不是src/main/java目录遵循Maven的约定,也就是说它不是Java源代码。

+0

谢谢,前面的“/”是我所需要的。我只是想,它会解决文字,文件系统'/'。 – 2011-12-19 21:12:16

1

默认情况下,非源文件应该位于src/main/resources文件夹中。

相关问题