java - 如何获取包含在我的源目录中的文件?

标签 java eclipse maven

我的 Maven/Eclipse 项目有一个非常简单的目录布局:

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

11 directories, 3 files

如您所见,我在 Java 源代码目录的底部有一个 sampleReport.xml 文件,但是当我尝试打开它时,我得到一个 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

    }
}

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

最佳答案

当 Maven 打包它时,它将把它放在项目的 .jar 中,它将不再作为 File 访问。

它可以作为 Stream 访问

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

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

关于java - 如何获取包含在我的源目录中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8567395/

相关文章:

java - 如果我的应用程序正在运行,请更改我在 Android 中的主页!

javascript - 使用 Tomcat 引用 Javascript 库

java - GlassFish 服务器无法从 Eclipse 启动,卡在 69%

java - 将构建路径切换到 JDK 10 后 Eclipse 找不到 XML 相关类

java - 解释maven javadoc插件空<p>标签报错

eclipse - 如何在 Eclipse 首选项中撤消将 Eclipse 构建中的目标运行标记为忽略?

javascript - Sonar 管 "Could not find source for unit test: Chrome_280150095_Windows.ButtonTest in any of test directories"

java - 如何从ListView中提取选定的项目?

java - JPA/Hibernate 无法创建名为 Order 的实体

java - Facebook 登录/Google 登录 - 相同的 Activity ?