2011-12-19 37 views
8

Tôi có một bố trí thư mục khá đơn giản cho dự án Maven/Eclipse của tôi:Tôi làm cách nào để có tệp được đưa vào thư mục nguồn của mình?

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

11 directories, 3 files 

Như bạn thấy, tôi đã có file sampleReport.xml tại các cơ sở của nguồn dir Java, nhưng khi tôi cố gắng để mở nó, tôi nhận được một 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) 

Dưới đây là tôi 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> 

Và đây là ứng dụng Java của tôi:

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 

    } 
} 

Tôi có thể tìm tệp này ở thư mục gốc của thư mục nguồn của mình bằng cách nào?

+1

Làm cho chương trình của bạn chạy với mã nguồn Java của bạn làm thư mục hoạt động - nhưng sau đó bạn sử dụng '.getResourceAsStream()' ngay bên dưới, tại sao bạn ngừng sử dụng nó? – fge

+3

+1 cho cây ASCII – SLaks

+0

@fge vì nó trả về giá trị rỗng. –

Trả lời

11

Khi gói Maven tải lên, nó sẽ đặt nó trong .jar của dự án, nó sẽ không thể truy cập dưới dạng File nữa.

Nó có thể được truy cập như một Stream với

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

Tập tin này nên thực sự được trong src/main/resources thư mục thay vì thư mục src/main/java làm theo công ước Maven, mà là để nói nó không phải là Java mã nguồn.

+0

Cảm ơn, "/" trước là những gì tôi cần. Tôi chỉ thấy rằng nó sẽ giải quyết cho hệ thống tập tin, chữ '/'. –

1

Tệp không phải nguồn được cho là nằm trong thư mục src/main/resources theo mặc định.

Các vấn đề liên quan