views:

370

answers:

2

Hello,

I'm facing a problem when I need to distribute my java application, created using NetBeans 6.8. I have some translation files made with gettext as class files - made with msgfmt from gettext package with the following script (shell script run under msys - no problems here)

PO_FILES=`find . -iname "*_*.po"`
rm -f *.class

for PO_FILE in $PO_FILES; do
  CLASS_NAME=`echo $PO_FILE | sed "s/\.po$//" | sed "s/^.*\///"`
  echo "Compiling $PO_FILE to class $CLASS_NAME"
  msgfmt --java2 $PO_FILE -r $CLASS_NAME -d .
done

Here is the directory structure:

main.jar
lib/translate/Messages_fr$1.class
lib/translate/Messages_fr.class 
lib/*.jar (many needed libraries - they work)

The manifest file has the following class-path:

lib/xxx.jar ... lib/translate ... lib/yyy.jar (jar files are not the problem)

The application works without any problem except the translation files which cannot be loaded. The loading part is the following (the client wants a French translation):

Locale.setDefault(Locale.FRANCE);
myResources = ResourceBundle.getBundle("Messages");

Note: This problem appears only when trying to run with the jar file (running from NetBeans works well, running from command line the compiled classes work also but not when running the jar file (java -jar main.jar).

The funny part is that I don't have this problem if I modify the class-path from the manifest file and add "." path to the classpath and having this directory structure:

main.jar
lib/translate/Messages_fr$1.class
lib/translate/Messages_fr.class 
lib/*.jar (many needed libraries - they work)
Messages_fr$1.class
Messages_fr.class

I am using Windows with the following Java versions:

C:\>java -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

D:\Program Files\Java\jdk1.6.0_17\bin>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)

I appreciate any help as this becomes frustrating.

Thank you,

Iulian

A: 

ResourceBundle works only on properties files and not java class files. It creates a Name Value Pair of data found in the properties file.

E.g.

myResources = ResourceBundle.getBundle("Messages", Locale.FRANCE); //Get the properties file "Messages_fr.properties" 

The Locale.java specifies FRANCE as

static public final Locale FRANCE = createSingleton("fr_FR_", "fr", "FR");

so the resource bundle will use fr_FR_, fr, FR and try appending each of them on "Messages" + "_" + Locale.

PS Your Resource File must have a ".properties" extension and resource files may not be declared "Messages_fr$1" but rather "Messages_fr.properties"

For class file, you need to load the class file as stream.

The Elite Gentleman
See my comment. The problem was a missing /. I don't know how to make NetBeans create such manifest but I would be interested finding that out.
Iulian Şerbănoiu
OK...Sorry, then my answer is of no use. Good luck with solving your problems.
The Elite Gentleman
A: 

The actual problem (as described in comments) was a missing / in the class path from the jar file. For example having only the path like this: path/myPath was not enough. I needed to add a / ( path/myPath/ ) to make it work

Iulian Şerbănoiu