FileNotFoundException启动jar - 无法在资源文件夹中看到文件

时间:2014-09-08 06:13:13

标签: java jar resources filenotfoundexception platform-independent

我希望我的应用程序与操作系统无关。因此我的config.properties和日志文件存储在resources文件夹中,我使用相对路径获取这些资源。 这是我的项目结构。project structure

这是我的AppConfig类:

public final class AppConfig {

private static final String RELATIVE_PATH_TO_PROPERTIES = "./src/main/resources/config.properties";
public static final String RELATIVE_LOG_PATH = "./src/main/resources/err_action.log";

private static Properties props = initProperties();
public static final String HOST = props.getProperty("ip_address");

public static final int PORT = Integer.valueOf(props.getProperty("port"));
public static final int MAX_USERS = Integer.valueOf(props.getProperty("max_number_of_users"));
public static final int NUM_HISTORY_MESSAGES = Integer.valueOf(props.getProperty("last_N_messages"));

private static Properties initProperties() {
    Properties properties = null;
    try (FileInputStream input = new FileInputStream(RELATIVE_PATH_TO_PROPERTIES)) {
        properties = new Properties();
        properties.load(input);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return properties;
}
}

如您所见,我指定了属性和日志文件的相对路径。 我用maven创建jar,当我运行它时,我收到了

  

java.io.FileNotFoundException:./ src / main / resources / err_action.log(没有这样的文件或目录)

UPD 这是我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>chat</groupId>
<artifactId>Client-Chat</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
    <java_version>1.8</java_version>
</properties>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>${java_version}</source>
                <target>${java_version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>nikochat.com.app.Main</mainClass>
                        <!--<mainClass>nikochat.com.app.RunClient</mainClass>-->
                    </manifest>
                </archive>
            </configuration>
        </plugin>

    </plugins>
</build>
</project>

我使用Intellij Idea并运行maven package 命令,其结果是下一个输出:

  

[INFO]扫描项目... [INFO]   -------------------------------------------------- ---------------------- [INFO] Building Unnamed - chat:Server-Chat:jar:1.0 [INFO]
  任务段:[包] [INFO]   -------------------------------------------------- ---------------------- [INFO] [resources:resources {execution:default-resources}] [警告]   使用平台编码(实际上是UTF-8)来复制过滤后的资源,   即构建依赖于平台! [INFO]复制2个资源[INFO]   [编译器:compile {execution:default-compile}] [INFO]没什么   编译 - 所有类都是最新的[INFO] [resources:testResources   {execution:default-testResources}] [警告]使用平台编码   (实际上是UTF-8)复制过滤后的资源,即构建是平台   依赖! [INFO]跳过不存在的resourceDirectory   / home / nikolay / IdeaProjects / Chat / src / test / resources [INFO]   [compiler:testCompile {execution:default-testCompile}] [INFO]没什么   编译 - 所有类都是最新的[INFO] [surefire:test   {execution:default-test}] [INFO] Surefire报告目录:   /家庭/尼古拉/ IdeaProjects /聊天/目标/万无一失的报告

     

----------------------------------------------- --------测试   -------------------------------------------------- -----运行AppConfigTest测试运行:2,失败:0,错误:0,跳过:2,时间   已过去:0.129秒

     

结果:

     

测试运行:2,失败:0,错误:0,跳过:2

     

[INFO] [jar:jar {execution:default-jar}] [INFO]构建jar:   /home/nikolay/IdeaProjects/Chat/target/Server-Chat-1.0.jar [INFO]   -------------------------------------------------- ---------------------- [INFO]建立成功[信息]   -------------------------------------------------- ---------------------- [INFO]总时间:11秒[INFO]完成时间:Mon Sep 08 09:47:18

     

EEST 2014 [INFO]最终记忆:18M / 154M [INFO]

开始时我创建了用于运行服务器部分应用程序的Server-Chat jar,而不是将artifactId更改为Client-Chat并清除mainClass以创建应用程序的客户端部分。 我在终端输入命令中运行这两个部分: java -jar Server-Chat-1.0.jar java -jar < strong> Client-Chat-1.0.jar 。

这是服务器的输出:

  

java.io.FileNotFoundException:config.properties(没有这样的文件或目录)           在java.io.FileInputStream.open(本机方法)

客户:

  

eaProjects / Chat / target $ java -jar Client-Chat-1.0.jar   java.io.FileNotFoundException:config.properties(没有这样的文件或目录)

2 个答案:

答案 0 :(得分:3)

src / main / resources 是具有资源文件的maven约定。当maven构建jar / war工件时,它会将 src / main / resources中的所有文件/目录添加到生成的工件的类路径

运行时没有可用的src / main /资源

在您的情况下,您可以更新您的程序以阅读这些文件,而无需提供任何路径。如下所示

private static final String RELATIVE_PATH_TO_PROPERTIES = "config.properties";
public static final String RELATIVE_LOG_PATH = "err_action.log";

答案 1 :(得分:2)

下面的代码应允许加载位于资源文件夹中的config.properties文件,该资源文件夹在构建之后部署到jar文件的根目录:

public final class AppConfig {

private static final String RELATIVE_PATH_TO_PROPERTIES="config.properties";
...
private static Properties initProperties() {
    Properties properties = null;

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    FileInputStream input =    classLoader.getResourceAsStream(RELATIVE_PATH_TO_PROPERTIES);
    try {
        properties = new Properties();
        properties.load(input);
    } catch (IOException e) {
        e.printStackTrace();
    }
    ...
    return properties;
    }
}

以下代码允许从jar应用程序的类路径加载文件:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
FileInputStream input = classLoader.getResourceAsStream(<relative path of the file located in the jar app>);