java.util.MissingResourceException: Can't find bundle for base name 'property_file name', locale en_US

StackOverflow https://stackoverflow.com/questions/20142002

  •  03-08-2022
  •  | 
  •  

Pregunta

I am trying to create a utility class ReadPropertyUtil.java for reading data from property file. While my class is located under a util directory , my skyscrapper.properties file is placed in some other directory.

But , when i try to access the properties using [ResourceBundle][1], i get exceptions, that bundle can't be loaded.

Below is the code on how I am reading the properties and also an image which shows my directory structure.

ReadPropertiesUtil.java

/**
 * Properties file name.
 */
private static final String FILENAME = "skyscrapper";

/**
 * Resource bundle.
 */
private static ResourceBundle resourceBundle = ResourceBundle.getBundle(FILENAME);

/**
 * Method to read the property value.
 * 
 * @param key
 * @return
 */
public static String getProperty(final String key) {
    String str = null;
    if (resourceBundle != null) {
        str = resourceBundle.getString(key);
            LOGGER.debug("Value found: " + str + " for key: " + key);
    } else {
            LOGGER.debug("Properties file was not loaded correctly!!");
    }
    return str;
}

Directory Structure

enter image description here

This line is giving the error private static ResourceBundle resourceBundle = ResourceBundle.getBundle(FILENAME);

I am unable to understand why isn't this working and what is the solution. The src folder is already added in build path completely.

¿Fue útil?

Solución

Try with the fully qualified name for the resource:

private static final String FILENAME = "resources/skyscrapper";

Otros consejos

ResourceBundle doesn't load files? You need to get the files into a resource first. How about just loading into a FileInputStream then a PropertyResourceBundle

   FileInputStream fis = new FileInputStream("skyscrapper.properties");
   resourceBundle = new PropertyResourceBundle(fis);

Or if you need the locale specific code, something like this should work

File file = new File("skyscrapper.properties");
URL[] urls = {file.toURI().toURL()};
ClassLoader loader = new URLClassLoader(urls);
ResourceBundle rb = ResourceBundle.getBundle("skyscrapper", Locale.getDefault(), loader);

Use the Resource like

ResourceBundle rb = ResourceBundle.getBundle("com//sudeep//internationalization//MyApp",locale);
or
ResourceBundle rb = ResourceBundle.getBundle("com.sudeep.internationalization.MyApp",locale);

Just give the qualified path .. Its working for me!!!

You should set property file name without .properties extension, it works correctly for me:)

I'd like to share my experience of using Ant in building projects, *.properties files should be copied explicitly. This is because Ant will not compile *.properties files into the build working directory by default (javac just ignore *.properties). For example:

<target name="compile" depends="init">
    <javac destdir="${dst}" srcdir="${src}" debug="on" encoding="utf-8" includeantruntime="false">
        <include name="com/example/**" />
        <classpath refid="libs" />
    </javac>
    <copy todir="${dst}">
        <fileset dir="${src}" includes="**/*.properties" />
    </copy>
</target>

<target name="jars" depends="compile">
    <jar jarfile="${app_jar}" basedir="${dst}" includes="com/example/**/*.*" />
</target>

Please notice that 'copy' section under the 'compile' target, it will replicate *.properties files into the build working directory. Without the 'copy' section the jar file will not contain the properties files, then you may encounter the java.util.MissingResourceException.

The simplest code would be like, keep your properties files into resources folder, either in src/main/resource or in src/test/resource. Then use below code to read properties files:

public class Utilities {
    static {
        rb1 = ResourceBundle.getBundle("fileNameWithoutExtension"); 
              // do not use .properties extension
    }
    public static String getConfigProperties(String keyString) {
        return rb1.getString(keyString);
    }
}

With Eclipse and Windows:

you have to copy 2 files - xxxPROJECTxxx.properties - log4j.properties here : C:\Eclipse\CONTENER\TOMCAT\apache-tomcat-7\lib

I have just realized that my error was caused in the naming convention of my property file. When i used xxxx.xxxx.properties i got the error:

java.util.MissingResourceException: Can't find bundle for base name 'property_file name', locale en_US

Changing it to something like xxx-xxxx.properties works like a charm. Hope i help someone!

just right click on the project file in eclipse and in build path select "Use as source folder"...It worked for me

You can try anyone with resources-

private static final String FILENAME = "resources.skyscrapper";
private static final String FILENAME = "resources/skyscrapper";
private static final String FILENAME = "resources\\skyscrapper";
private static final String FILENAME = "resources//skyscrapper";

By default it tries to find 'skyscrapper.properties' file inside 'src' but you have placed your file inside a sub-directory 'resources' which is unreachable.

In a maven project-

It looks like- 'src/main/resources/skyscrapper.properties' then use-

private static final String FILENAME = "skyscrapper";

And if it looks like- 'src/main/resources/prop/xyz/skyscrapper.properties' then use-

private static final String FILENAME = "prop/xyz/skyscrapper";
private static final String FILENAME = "prop.xyz.skyscrapper";

In this case by default it tries to find 'skyscrapper.properties' file inside 'src/main/resources' but your file is actually inside a subdirectory of resources then you need to provide relative path otherwise you may receive exception like-

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name src\main\resources\prop\xyz\skyscrapper.

Check project build path. May be only the *.java files are included. This problem occured in my Maven project. I needed to alter my pom.xml file.

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
</build>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top