59063


### 発生している問題

* * *

Eclipseで作成した、Maven
webappプロジェクトの、`src/test/resources`ディレクトリにある、`.properties`ファイルを`ClassLoader.getResourceAsStream()`で読み込みたいのですが、'NullPointer'
で読み込めません。

### 試したこと

* * *

pom.xmlかパスの表記に問題があるのではないかと思い色々調べて試しましたが、  
どれもnullになります。

実効pomのtestResourceが  
${basedir}/upload_image_db4/src/main/resources  
なので、  
getResourceAsStream（"/jdbc/JdbcDataSource_H2.properties"）と考えていますが誤りでしょうか。

基本的な部分で間違っているような気がするので、「よくある間違い」的な小さなヒントで構いません。  
何か情報をいただけると幸いです。

宜しく御願い致します。

* * *

**ディレクトリ**

[code]

    src
      |-main
      |-test
         |---java 
               -testModel
                  GetDataSourceLogic.java
    
    
         |---resources
              -jdbc
                  JdbcDataSource_H2.properties
    
    
    
[/code]

### エラーメッセージ

[code]

    Caused by: java.lang.NullPointerException
        at test.model.logic.RegisterLogicTest2.<clinit>(RegisterLogicTest2.java:35)
        ... 55 more
    
    
[/code]

### 該当のソースコード

[code]

    public class GetDataSourceLogic{
            public JdbcDataSource getH2DataSource() throws IOException{
    
                Properties props = new Properties();
                JdbcDataSource dataSource = new JdbcDataSource();
                try(InputStream in=ClassLoader.class.getResourceAsStream("/jdbc/JdbcDataSource_H2.properties")){
                    props.load(in);
                    dataSource.setURL(props.getProperty("JDBC_URL"));
                    dataSource.setUser(props.getProperty("USER"));
                    dataSource.setPassword(props.getProperty("PASSWORD"));
    
    
                return dataSource;
    
            }
    
[/code]

**Ecilpseの実効pom** (抜粋)

[code]

      <build>
       : 
        <testResources>
          <testResource>
            <directory>/Applications/Eclipse_2019-03.app/Contents/upload_image_db4/src/test/resources</directory>
          </testResource>
        </testResources>
       :
       :
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>build-helper-maven-plugin</artifactId>
              <version>1.5</version>
              <executions>
                <execution>
                  <id>add-test-source</id>
                  <phase>process-resources</phase>
                  <goals>
                    <goal>add-test-source</goal>
                  </goals>
                  <configuration>
                    <sources>
                      <source>/Applications/Eclipse_2019-03.app/Contents/upload_image_db4/src/test/resources</source>
                    </sources>
                  </configuration>
                </execution>
              </executions>
            </plugin>
            <plugin>
        :
    
    
[/code]

**JdbcDataSource_H2.properties**

[code]

    #H2 JDBC
    JDBC_DRIVER=org.h2.Driver.class.getName();
    JDBC_URL=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    USER=sa
    PASSWORD=
    
    
    
[/code]

### 補足情報

Eclipse 4.11.0  
Maven 3


CC BY-SA 4.0
2019-09-04T00:55:16.807
57822
2019-11-01T21:37:52.050
2019-11-01T21:37:52.050
34716
34716
question
java eclipse maven
ClassLoder.getResourceAsStream()で.propertiesファイルを読み込めず、Nullになる


まず、質問文中で使用しているメソッド

[code]

    ClassLoader.class.getResourceAsStream(...)
    
[/code]

は
[`ClassLoader#getResourceAsStream()`](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/ClassLoader.html#getResourceAsStream-
java.lang.String-) でなく
[`Class#getResourceAsStream()`](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Class.html#getResourceAsStream-
java.lang.String-)です。

次に、`ClassLoader`はJDKに含まれるクラスであり、

>
> このメソッドは、このオブジェクトのクラス・ローダーに委譲されます。このオブジェクトがブートストラップ・クラス・ローダーによってロードされた場合、このメソッドはClassLoader.getSystemResourceAsStream(java.lang.String)に委任します。

に該当し、結果、システムリソースを検索しようとしている実装になっています。

代わりに次を用います:

[code]

    GetDataSourceLogic.class
    .getResourceAsStream("/jdbc/JdbcDataSource_H2.properties")
    
[/code]

あるいは

[code]

    Thread.currentThread().getContextClassLoader()
    .getResourceAsStream("jdbc/JdbcDataSource_H2.properties")
    
[/code]

いずれの場合も、 `getResource("")` メソッド(引数に空文字列を与える)の戻り値を見ればどこを指しているのか理解できるかと思います。


CC BY-SA 4.0
2019-09-14T08:01:00.960
59063
2019-09-14T08:01:00.960
2808
57822
answer