运行jar时,项目抛出IOException(File Not Found)

时间:2016-03-14 08:47:04

标签: java eclipse maven jar properties

我使用Eclipse在java中创建了一个项目。

这是项目结构:

enter image description here

当我在Eclipse中将项目作为Java应用程序运行时,它运行得很好。

现在,我需要将其导出为jar。所以,我使用此链接第3个答案中描述的方法创建了jar(由Fever回答):

Failing to run jar file from command line: “no main manifest attribute”

以下是jar tf EventLogger.jar的输出:

META-INF/MANIFEST.MF
com/
com/project/
com/project/eventLogger/
com/project/eventLogger/KafkaConsumerGroup.class
com/project/eventLogger/KafkaProducer.class
com/project/eventLogger/ConsumeConfig.class
com/project/eventLogger/ConsumerThread.class
com/project/eventLogger/Formatter.class
com/project/eventLogger/Execute.class
com/project/eventLogger/Config.class
com/project/eventLogger/package-info.class
com/project/eventLogger/ProdConfig.class
com/project/eventLogger/FormatConfig.class
resources/
resources/Config.properties
resources/ConsumerConfig.properties
resources/FormatterConfig.properties
resources/ProducerConfig.properties
resources/log4j.properties

这是清单文件:

Manifest-Version: 1.0
Built-By: vishrant
Class-Path: lib/json-simple-1.1.1.jar lib/junit-4.10.jar lib/hamcrest-
 core-1.1.jar lib/kafka_2.9.2-0.8.2.2.jar lib/jopt-simple-3.2.jar lib/
 kafka-clients-0.8.2.2.jar lib/log4j-1.2.16.jar lib/lz4-1.2.0.jar lib/
 metrics-core-2.2.0.jar lib/slf4j-api-1.7.6.jar lib/snappy-java-1.1.1.
 7.jar lib/slf4j-log4j12-1.6.1.jar lib/zkclient-0.3.jar lib/zookeeper-
 3.4.6.jar lib/jline-0.9.94.jar lib/netty-3.7.0.Final.jar lib/scala-li
 brary-2.9.2-RC3.jar
Build-Jdk: 1.8.0_74
Created-By: Maven Integration for Eclipse
Main-Class: com.project.eventLogger.Execute

并且,这是例外:

java.io.FileNotFoundException: ConsumerConfig.properties (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at com.project.eventLogger.ConsumeConfig.loadPropertiesFile(ConsumeConfig.java:34)
    at com.project.eventLogger.ConsumeConfig.<clinit>(ConsumeConfig.java:42)
    at com.project.eventLogger.Execute.main(Execute.java:18)
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.project.eventLogger.Execute.main(Execute.java:18)
Caused by: java.lang.NullPointerException
    at com.project.eventLogger.ConsumeConfig.<clinit>(ConsumeConfig.java:47)
    ... 1 more

看到异常,很明显它无法加载ConsumerConfig.properties中正在进行的ConsumeConfig.java

以下是ConsumeConfig.java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Properties;

/**
 * @author vishrant
 *
 */
public class ConsumeConfig {

    public static String zookeeper;
    public static String balance;
    public static String bootstrap_servers;
    public static String zk_session_to;
    public static String zk_sync;
    public static String auto_commit;
    public static String[] topics;
    private static String kafka_bin;
    private static final String PROPERTIES_FILE_PATH = "src/main/resources/ConsumerConfig.properties";

    private static Properties loadPropertiesFile() throws IOException {
        Properties properties = new Properties();
        InputStream in = new FileInputStream(PROPERTIES_FILE_PATH);
        properties.load(in);
        return properties;
    }

    static {
        Properties property = null;
        try {
            property = loadPropertiesFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        zookeeper = property.getProperty("ZOOKEEPER");
        balance = property.getProperty("BALANCE");
        bootstrap_servers = property.getProperty("BOOTSTRAP_SERVERS");
        zk_session_to = property.getProperty("ZK_SESSION_TO");
        zk_sync = property.getProperty("ZK_SYNC_TIME");
        auto_commit = property.getProperty("AUTO_COMMIT_INTERVAL");
        topics = property.getProperty("CONSUMER_TOPICS").split(",");
        kafka_bin = property.getProperty("KAFKA_BIN_PATH");
    }
}

有人可以告诉我问题是什么以及如何解决这个问题?

在Eclipse本身运行时运行良好。

EDIT1:

现在,例外是:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.project.eventLogger.Execute.main(Execute.java:18)
Caused by: java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Properties.java:434)
    at java.util.Properties.load0(Properties.java:353)
    at java.util.Properties.load(Properties.java:341)
    at com.project.eventLogger.ConsumeConfig.loadPropertiesFile(ConsumeConfig.java:35)
    at com.project.eventLogger.ConsumeConfig.<clinit>       (ConsumeConfig.java:42)
    ... 1 more

第35行:

props.load(resourceStream);

这是现在的代码:

private static final String PROPERTIES_FILE_PATH = "ConsumerConfig.properties";

private static Properties loadPropertiesFile() throws IOException {
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    Properties props = new Properties();
    InputStream resourceStream = loader.getResourceAsStream(PROPERTIES_FILE_PATH);
    props.load(resourceStream);
    return props;
}

2 个答案:

答案 0 :(得分:1)

我发现以下问题是原因:

  • 没有为maven项目正确创建jar文件,因为目录资源通常不会按原样复制到目标目录,即代替
  

资源/ Config.properties

看起来应该没有资源目录:

  

Config.properties

直接位于jar文件的根目录下。

  • 第二点是您在代码中使用以下内容
  

private static final String PROPERTIES_FILE_PATH =&#34; src / main / resources / ConsumerConfig.properties&#34;;

在IDE之外(在本例中为Eclipse)不会看到此路径,因为jar文件中不应存在 src / main / resources ,因为您可以在jar文件列表中看到

  • 最后一点是,你应该使用类加载器的getResourceAsStream()作为 Vikrant Kashyap 已经指出。

答案 1 :(得分:0)

试试这个

  //Change  Your File Path First.
 private static final String PROPERTIES_FILE_PATH = "ConsumerConfig.properties";

 private static Properties loadPropertiesFile() throws IOException {
        Properties properties = new Properties();
             //First way to load ResourceAsStream.
        //ClassLoader loader = Thread.currentThread().getContextClassLoader();
        //InputStream resourceStream = loader.getResourceAsStream(PROPERTIES_FILE_PATH);

        //Second way to load ResourceAsStream.
        InputStream resourceStream = ConsumeConfig.class.getResourceAsStream(PROPERTIES_FILE_PATH);
        properties.load(resourceStream);
        return properties;
    }
相关问题