vikas
vikas

Reputation: 1506

Adding resources in IntelliJ for Maven project

I have a project structure like this:

src
 |-main
    |-java
       |-com.abc.xyz
          |-Login.java

I have to add a resource file to this and read the resource with

InputStream is = getClass().getResourceAsStream("launchers.properties");

This is giving null.

In Intellij I am not able to add a new package under src/main for resources folder so that the project structure looks like this. How can I load the launchers.properties resource file into the project?

src
 |-main
    |-java
       |-com.abc.xyz
          |-Login.java
    |-resources
       |-com.abc.xyz
          |-Login
             |-launcher.properties

I tried the solution suggested by @maba but still not working

Upvotes: 48

Views: 121506

Answers (7)

acanbiler
acanbiler

Reputation: 153

Only solution worked for me:

File -> Project Structure -> Modules -> Dependencies Tab -> + Sign -> JARs or directories -> select resources directory -> Classes

Upvotes: 0

dasunse
dasunse

Reputation: 3089

Follow these two steps

1) Create a directory

Right Click ==> New ==> Directory

2) Mark Directory as Resources Root

Right Click on the Direcory ==> Mark Directory as ==> Resources Root

Upvotes: 3

Soodabeh Neirizi
Soodabeh Neirizi

Reputation: 85

from menu Run/edit configuration in VM option you should add -Dspring.config.location=path-file

I've tried it in IntelliJ, and it works!

Upvotes: 0

vivanov
vivanov

Reputation: 1522

I had the same problem and noticed that the resource file, for example: my.properties is not copied to the corresponding module folder in the target directory after build occurres. In order to solve that, I had to instruct Maven to copy the resources from the module directory to the target directory during the build process. In the .pom file I added <resource> element like that:

<project ...>
    ...
    <build>
        ...
        <resource>
            <directory>src/main/java/com/abc/xyz</directory>
            <targetPath>com/abc/xyz</targetPath>
        </resource>
    </build>
    ...
</project>

Note that the <directory> element is relative to the location of the .pom file , i.e. the root directory of the project, and the <targetPath> element indicates the package name separated by slashes.

Upvotes: 0

WesternGun
WesternGun

Reputation: 12728

No..... the structure is wrong.... you should not create the same package under resources, that is ugly and not proper: resources is for resources, and should not contain source packages.

When using ClassLoader.getResources(asStream)(path) method, the method just starts searching from the root of the classpath and the path name cannot start with / as leading characters. What you have to do, is to mark the resources as resources folder in IntelliJ. Then the files under resources will be listed under classpath and you can easily use them like you have done.

(I see in previous answers this option is not available yet in 2013, you only have mark as source folder, just like in Eclipse till now we have "add source folder", but now in 2018 it is available in Intellij: you can mark a folder as source, resources, test source, test resources, and all of them will be add to the root of classpath. )

Upvotes: 0

boky
boky

Reputation: 835

As @maba pointed out, your properties file should be in the same package as your class for your code to work.

So, you should have two files:

  • src/main/java/com/abc/xyz/Login.java
  • src/main/resources/com/abc/xyz/launcher.properties

If IntelliJ is showing the resource or not is beside the question. What you need to do is check if the results are included in your target artefact.

Do a build all in IntelliJ, open up the resulting WAR/JAR/EAR with your favorite ZIP viewer and browse into the "com/abc/xyz" folder. You should see both files there.

  • If they are, you are doing something wrong in your code. Check for typos, especially dots and spaces at the end or beginning (e.g. "launcher.properties[space]"), copy/paste the file name to make sure
  • If they are not there, your IntelliJ setup is wrong. Resources do not get included in your target build. Check online for tutorials how to do this with IntelliJ idea.

Upvotes: 4

maba
maba

Reputation: 48065

The launcher.properties should not be under a folder called Login. It should be placed directly in the src/main/resources/com/abc/xyz folder.


It is really as simple as I said but if the resources folder is not marked as a sources folder then this may be the problem.

This is the initial class and setup:

enter image description here

Now create the resources folder:

enter image description here

enter image description here

This newly created folder should be automatically marked as a sources folder and if it is blue color marked then it is. Otherwise you'll have to mark it manually:

enter image description here

Now you'll be able to add packages to it:

enter image description here

enter image description here

And now you can add the file to it:

enter image description here

enter image description here

And rerunning the application will not give you any null value back:

enter image description here

And the package view will surely show the launchers.properties file as well:

enter image description here

Upvotes: 76

Related Questions