2014-10-06 2 views
0

내 웹 응용 프로그램 (간단한 서블릿 응용 프로그램)에서 JAR 파일 내에있는 메서드를 호출하려고합니다. 다음은 그 방법은 속성에 액세스하기 위해 사용하는 코드는 파일 :이 방법은 내 웹 응용 프로그램을 사용하여 호출 할 때, 나는이 NullPointerException 무엇입니까웹 응용 프로그램 내에서 속성 파일을 찾을 수 없습니다.

InputStream inputStream = 
      ClassLoader.getSystemClassLoader() 
         .getResourceAsStream("demo.properties"); 

properties.load(inputStream); 

:

java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Unknown Source) 
    at java.util.Properties.load0(Unknown Source) 
    at java.util.Properties.load(Unknown Source) 

가능한 이유는이 예외이기 때문이다 : 내 웹 응용 프로그램에서 demo.properties 파일을 찾을 수 없기 때문에 inputStreamNULL이고이 예외가 throw됩니다.

알려 주시기 바랍니다 :

  1. 방법이 예외를 해결하기 위해.

  2. 웹 기반 응용 프로그램 내에서 수동으로 속성 파일을 배치해야합니까? 그렇다면 정확히 어디에이 예외를 해결하기 위해 내 웹 응용 프로그램에이 demo.properties 파일을 배치 할 위치.

+0

는'demo.properties' 현재 단지 내에서 발생한다? –

+2

'src' 폴더는 프로젝트 폴더입니다. 생성 된'.jar' 파일은 어디에 있습니까? –

+0

'루트 '디렉토리에 있습니다.디 컴파일러를 사용하여'jar' 파일을 열면 루트 디렉토리에서 볼 수 있습니다. (i, e, 어떤 패키지에도 포함되지 않습니다.) – user182944

답변

2

시스템 클래스 로더는 핵심 Java 라이브러리 (예 : java.lang)에 대해서만 알고 있습니다. , java.util.

클래스를로드 한 클래스 로더와 동일한 JAR 파일을 보는 동일한 클래스 로더를 사용하여 속성 파일을로드하려고합니다. 이 같은

시도 뭔가 :

public class PropertyFileTest { 
    public void loadProperties() { 
     InputStream inputStream = PropertyFileTest.class.getResourceAsStream("/demo.properties"); 

     properties.load(inputStream); 
     // do something with properties to see if it worked or not. 
    } 
} 

주 내가는 Class.getResourceAsStream를 사용, 당신을 위해 클래스의 클래스 로더를 사용합니다, 당 :

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

+0

귀하의 의견에서 이해할 수있는 것은 : 내 웹 응용 프로그램은 항아리 안에있는 클래스 파일을로드하기 위해' .class.getResourceAsStream' 로더를 사용하므로 병이 있습니다. 파일은 또한 같은 클래스를 사용하여 속성을로드해야합니다. fiel - Correct? – user182944

+0

클래스를로드 한 클래스 로더는 * 속성 파일을로드 할 수있는 클래스 로더와 같아야합니다. 시스템 클래스 로더는 JAR 파일에 대해 아무 것도 모르기 때문에 클래스 OR 특성 파일을 모릅니다. – Brandon

+0

나는 혼란 스럽다고 생각한다 !!! jar 파일에서'properties' 파일에 접근하고 있습니다. 내 '웹 응용 프로그램'은 jar 파일 메서드를 호출하여 jar 파일에 액세스합니다 (웹 응용 프로그램에서 직접 속성 파일을 호출하지 않고 jar 파일 자체를 사용하여 호출합니다). – user182944

2

클래스 로더는 /demo.properties (그러나 결코 ClassLoader.getResource의 제목 슬래시를 사용)이었다 따라서 것처럼, 절대 경로로 전달 된 문자열을 interprete. 그래서 전쟁을 열고 /WEB-INF/classes/demo.properties을 찾으십시오. 대소 문자를 구분해야합니다.

당신은 (일반적으로) 대안에 관심이있을 수 있습니다

  • MyServletClass.class.getResourceAsStream("/demo.properties") - 더 나은;
  • ResourceBundle bundle = ResourceBundle.get("demo");
  • /WEB-INF/web.xml에서 서블릿의 초기화 매개 변수를 사용합니다.
+0

@SotiriosDelimanolis "였지만"ClassLoader의 제목 슬래시는 절대로 사용하지 마십시오. " –

+0

그런 경우'SomeJarClass.class.getResourceAsStream ("/ demo.properties")'를 할 수 있습니다. 차이점은 ClassLoader는 클래스 경로를 검색하는 클래스 로더 (몇 개의 jar)에서 일부 계층 구조에 있지만 클래스를 사용하면 하나의 jar을 직접 처리하는 것이 더 직접적이라는 것입니다. –

+0

그래, 현재 내 Jar 파일에서 속성 파일에 액세스하는 방식을 변경하도록 요청한다는 의미입니다. 'ClassLoader.getSystemClassLoader() .getResourceAsStream' 메서드를 사용하는 것보다는'ClassName.class.getResourceAsStream' 메서드를 사용해야합니까? 내가 너를 제대로 가졌는지 확인해. – user182944

-1

클래스 로더가 확인되지 않는 속성 파일 위치

사용이 코드 :

String path = AbcServiceImpl.class.getClassLoader().getResource("abc.properties").getFile().toString(); 
path = path.replace("%20", " "); 
File f = new File(path); 
관련 문제