Search code examples
javamavenjbpmproperties-file

Reading properties files "inStream parameter is null"


I have read property files before and I realize there are many links on the topic but I think my properties file is not getting packaged correctly due to plug-ins. My Eclipse project has a properties file in src/main/resources called environment.properties. I have tried reading it through a method, even trying to declare the method as both static and non-static at different times:

  static Properties properties = new Properties();

  public void getClassPathProperties() {
      
      LOGGER.debug("getClassPathProperties Enter");
      try (final InputStream input = Utils.class.getClassLoader().getResourceAsStream("environment.properties")) {
          properties.load(input);
          LOGGER.debug("properties found:");
          for (Object key : properties.keySet()) {
              LOGGER.debug("" + ((String) key) + "=" + properties.getProperty((String) key));             
          }
      } catch (Exception e) {
              LOGGER.error("Unable to find environment.properties on classpath to Utils.class");
              e.printStackTrace();
      }
      LOGGER.debug("getClassPathProperties Exit");
  } 

I tried the static declaration first but also tried non-static when a few posts mentioned it works until being declared as a static. I have also tried placing the environment.properties file manually within the the JAR file in different places without success. From Eclipse the exception is:

14:33:52.676 [main] ERROR com.goprecise.ams.handlers.utils.Utils - Unable to find environment.properties on classpath to Utils.class
java.lang.NullPointerException: inStream parameter is null
    at java.base/java.util.Objects.requireNonNull(Objects.java:246)
    at java.base/java.util.Properties.load(Properties.java:403)

and from the Maven command line an NPE on Properties.load() is reported (the LOGGER.error() message is from the code shown). The pom.xml is:

<?xml version="1.0"?>
... header ...
  <properties>
    <version.org.kie>7.48.0.Final-redhat-00004</version.org.kie>
    <version.org.powermock>1.7.4</version.org.powermock>
    <version.junit>4.12</version.junit>
    <version.org.slf4j>1.7.26</version.org.slf4j>
    <java.module.name>${project.name}</java.module.name>
  </properties>

  <dependencyManagement>
    <dependencies>
... depeendencies 
    </dependencies>
  </dependencyManagement>

  <dependencies>
... many more dependencies
  </dependencies>
  <build>
    <sourceDirectory>${project.build.directory}/generated-sources/java</sourceDirectory>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
          <include>*.png</include>
        </includes>
      </resource>
      <resource>
        <directory>${project.build.directory}/maven-shared-archive-resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>*.part</include>
        </includes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>templating-maven-plugin</artifactId>
        <version>1.0.0</version>
        <executions>
          <execution>
            <id>filter-src</id>
            <goals>
              <goal>filter-sources</goal>
            </goals>
            <configuration>
              <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
              <outputDirectory>${project.build.directory}/generated-sources/java</outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
          <execution>
            <id>copy-repository-resources</id>
            <phase>compile</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <encoding>UTF-8</encoding>
              <resources>
                <resource>
                  <directory>target/generated-sources/annotations</directory>
                  <includes>
                    <include>repoindex.html</include>
                    <include>*.wid</include>
                  </includes>
                  <filtering>true</filtering>
                </resource>
              </resources>
              <outputDirectory>target/classes</outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <annotationProcessors>
            <annotationProcessor>org.jbpm.process.workitem.core.util.WidProcessor</annotationProcessor>
          </annotationProcessors>
          <compilerArgs>
            <arg>-AwidName=${project.artifactId}</arg>
            <arg>-AgenerateTemplates=true</arg>
            <arg>-AgenerateWids=true</arg>
            <arg>-AwidsResources=${project.artifactId}.wid:widtemplate.st</arg>
            <arg>-AtemplateResources=kie-deployment-descriptor.xml:kie-ddtemplate.st,serviceinfo.json:serviceinfo.st,repoindex.html:repoindex.part,index.html:indextemplate.st,${project.artifactId}.bpmn2:defaultprocess.st</arg>
          </compilerArgs>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
          <!-- root module has no assembly so ignore it -->
          <ignoreMissingDescriptor>true</ignoreMissingDescriptor>
          <descriptors>
            <descriptor>${project.basedir}/assembly/assembly.xml</descriptor>
          </descriptors>
          <archive>
            <addMavenDescriptor>false</addMavenDescriptor>
          </archive>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <appendAssemblyId>false</appendAssemblyId>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.22.2</version>
        <executions>
          <execution>
            <id>integration-test-execution</id>
            <phase>verify</phase>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <systemPropertyVariables>
            <groupId>${project.groupId}</groupId>
            <artifactId>${project.artifactId}</artifactId>
            <version>${project.version}</version>
            <builddir>${project.build.directory}</builddir>
          </systemPropertyVariables>
          <failIfNoTests>false</failIfNoTests>
          <test>${it.test}</test>
          <includes>
            <include>**/*IntegrationTest.java</include>
          </includes>
          <argLine>${failsafe.arg.line}</argLine>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.commonjava.maven.plugins</groupId>
        <artifactId>project-sources-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>project-sources</id>
            <goals>
              <goal>archive</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.2</version>
        <configuration>
          <includes>
            <include>**/*Test.java</include>
          </includes>
          <excludes>
            <exclude>**/*IntegrationTest.java</exclude>
          </excludes>
          <argLine>-Xmx1024m -Dfile.encoding=UTF-8</argLine>
          <systemPropertyVariables>
            <apple.awt.UIElement>true</apple.awt.UIElement>
            <org.uberfire.nio.git.daemon.enabled>false</org.uberfire.nio.git.daemon.enabled>
            <org.uberfire.nio.git.ssh.enabled>false</org.uberfire.nio.git.ssh.enabled>
            <org.uberfire.sys.repo.monitor.disabled>true</org.uberfire.sys.repo.monitor.disabled>
          </systemPropertyVariables>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <id>default-jar</id>
          </execution>
          <!-- No OSGi manifestEntries for <goal>jar</goal>: if it supported, then felix has already added them -->
          <execution>
            <id>test-jar</id>
            <goals>
              <goal>test-jar</goal>
            </goals>
            <configuration>
              <skipIfEmpty>true</skipIfEmpty>
              <excludes>
                <exclude>**/logback-test.xml</exclude>
                <exclude>**/jndi.properties</exclude>
              </excludes>
              <archive>
                <manifestEntries>
                  <Bundle-SymbolicName>${java.module.name}.tests</Bundle-SymbolicName>
                  <Bundle-Version>
                    ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}.${osgi.snapshot.qualifier}
                  </Bundle-Version>
                  <Bundle-Name>${project.name}</Bundle-Name>
                  <Bundle-Vendor>${project.organization.name}</Bundle-Vendor>
                </manifestEntries>
              </archive>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <archive>
            <manifest>
              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>1.5</version>
        <configuration>
          <resourceBundles>
            <resourceBundle>org.jbpm.contrib:template-resources:${version.org.kie}</resourceBundle>
          </resourceBundles>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

I want the code in the JAR to find the properties at run-time: if the property file does not belong in src/main/resources (the typical place) where does it belong? If a plug-in is interfering with this how can I configure the plugin to enable my reading properties (or would simply moving the file enable it to be read)?


Solution

  • It's the declaration:

          <resource>
            <directory>src/main/resources</directory>
            ...
            <includes>
              <include>*.png</include>  <!-- just this one isn't enough -->
            </includes>
          </resource>
    

    If you (re-)declare the resources explicitely it's not cummulative with the defaults, i.e. the defaults are overriden. Have a look at your target/classes and you will find just PNG images there.

    See resources:[testR|r]esources:

    Always uses the project.build.[testR|r]esources element to specify the resources to copy.

    and POM Reference, Super POM:

    <project>
      ...  
      <build>
        ...
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
          </testResource>
        </testResources>
    

    which means: Take all from these dirs by default but take nothing from these dirs if overridden (unless you include it when overriding).