【问题标题】:Java GetResourceAsStream NullPointerExceptionJava GetResourceAsStream NullPointerException
【发布时间】:2013-08-22 11:14:33
【问题描述】:

我有一个 jar,我通常在 .sh 脚本中使用 jsvc 启动器作为守护进程运行。 现在我创建了一个新的入口点,它需要检查一些事情并在控制台上返回一个输出,所以在同一个 .sh 脚本中,我根据参数进行了切换,以作为守护进程或作为标准 Java 应用程序运行。 sh 类似这样:

#!/bin/sh

# Setup variables
EXEC=/usr/bin/jsvc
JAVA_HOME=/usr/lib/jvm/java-7-oracle
CLASS_PATH="./conf:/usr/share/java/commons-daemon.jar:./:./dist/core.jar"

do_exec()
{
    $EXEC -home "$JAVA_HOME" -cp $CLASS_PATH $1 $CLASS
}

for i in `ls ./dist/lib/*.jar`
do
  CLASS_PATH=${CLASS_PATH}:${i}
done

case "$1" in
    start)
            do_exec
            ;;
    stop)
            do_exec "-stop"
            ;;
    check)
            java -jar ./dist/core.jar check
            ;;
    *)
            echo "usage: daemon {start|stop|restart|check}" >&2
            exit 3
            ;;
esac

只有以“check”标志开头时,我的 core.jar 才能读取我的 core.properties 文件,代码为:

public class Config {

    private final static String RESOURCE_NAME = "core.properties";
    private static Properties properties = null;

    public static synchronized void init() {
        if (properties != null) {
            return;
        }
        try {
            properties = new Properties();
            properties.load(Config.class.getClassLoader().getResourceAsStream(RESOURCE_NAME));  <--- problematic line
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

    public static String get() {
       ...
    }
}

例外是:

Exception in thread "main" 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 me.core.util.Config.init(Config.java:28)
    at me.core.util.Config.get(Config.java:36)
    at me.core.Main.checkCoreStatus(Main.java:55)
    at me.core.Main.main(Main.java:33)

我的文件夹结构是这样的:

root folder
    |_ run.sh
    |_ conf
         |_ core.properties
    |_ dist
         |_ core.jar
         |_ lib
             |_ lib1.jar
             |_ lib2.jar
             |_ lib3.jar
             |_ ....jar
             |_ ....jar

我的jar清单如下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Administrator
Build-Jdk: 1.7.0_21
Main-Class: me.zenfeed.Main
Class-Path: ./conf/ ./dist/lib/junit-4.11.jar ./dist/lib/hamcrest-core-1.3.jar ....etc...

我看到包含 conf 目录,但我不知道 ./conf/ 是否包含该目录中的所有文件。 我应该怎么做才能使属性文件作为守护进程和标准 jar 可读?

谢谢

【问题讨论】:

    标签: java ubuntu jar classpath jsvc


    【解决方案1】:

    我找到了解决方案。 pom.xml 中存在问题,导致类路径前缀错误。

    原来是这样的:

    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <archive>
                <!-- Make an executable jar, adjust classpath entries-->
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>.dist/lib/</classpathPrefix>
                    <mainClass>xxxxxxx</mainClass>
                </manifest>
                <!--Resources will be placed under conf/-->
                <manifestEntries>
                    <Class-Path>./conf/</Class-Path>
                </manifestEntries>
            </archive>
            <finalName>${project.artifactId}</finalName>
            <outputDirectory>${project.build.directory}/dist</outputDirectory>
        </configuration>
    </plugin>
    

    而不是这个:

    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <archive>
                <!-- Make an executable jar, adjust classpath entries-->
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>./lib/</classpathPrefix>
                    <mainClass>xxxxxxx</mainClass>
                </manifest>
                <!--Resources will be placed under conf/-->
                <manifestEntries>
                    <Class-Path>../conf/</Class-Path>
                </manifestEntries>
            </archive>
            <finalName>${project.artifactId}</finalName>
            <outputDirectory>${project.build.directory}/dist</outputDirectory>
        </configuration>
    </plugin>
    

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2011-05-16
      • 2012-08-18
      • 2012-10-05
      相关资源
      最近更新 更多