Link to home
Start Free TrialLog in
Avatar of s_lavie
s_lavie

asked on

set JAVA_HOME for a win2000 batch file

I wrote a .bat file to run a java application on win2000:
@set JAVA_HOME=C:\JavaSoft\JRE\1.3.1_04
works fine, but
@set JAVA_HOME=C:\Program Files\JavaSoft\JRE\1.3.1_04
or
@set JAVA_HOME="C:\Program Files\JavaSoft\JRE\1.3.1_04"
doesn't work!

How I can set JAVA_HOME, with a path name that contains spaces?
Avatar of klf
klf

change Program Files to PROGRA~1
Avatar of s_lavie

ASKER

What if my directory name is "New Folder"? (and I have also "New Folder1" and "New Folder2")
open a dos window and do dir /X this should give you the short file names.
Avatar of Mick Barry
Try setting the various different homes in your system environment:

JAVA_HOME1=...
JAVA_HOME2=...

And then in your batch file use:

set JAVA_HOME="%JAVA_HOME2%"
Avatar of s_lavie

ASKER

klf,
I want to set this variable automatically during installation (using the JavaHome registry value).
Is there a way to find the short file name in runtime (using java or whatever).
My installation application is generated by InstallShield Multi Platform.

objects,
I wish not to set a system environment unless it's a must...
BTW, exactly how doesn't it work?  I don't recall ever having problems with long filenames in batch files.
Avatar of s_lavie

ASKER

The relevant part in my batch is as following:

@set JAVA_HOME=
@if EXIST "%JAVA_HOME%\bin\java.exe" GOTO JAVA_HOME_OKAY
   @ECHO.   JAVA_HOME is not set properly !!!
   @GOTO THE_END
:JAVA_HOME_OKAY

Now,
For:
@set JAVA_HOME=C:\Program Files\JavaSoft\JRE\1.3.1_04
I get:
'C:\Program' is not recognized as an internal or external command, operable program or batch file.

For:
@set JAVA_HOME="C:\Program Files\JavaSoft\JRE\1.3.1_04"
I get:
JAVA_HOME is not set properly !!!

For:
@set JAVA_HOME="C:\Progra~1\JavaSoft\JRE\1.3.1_04"
I get:
Exception in thread "main" java.lang.NoClassDefFoundError: \bin\java

And only:
@set JAVA_HOME=C:\Progra~1\JavaSoft\JRE\1.3.1_04
works fine!
Try the following:

@set JAVA_HOME="C:\Program Files\JavaSoft\JRE\1.3.1_04"
@if EXIST %JAVA_HOME%\bin\java.exe GOTO JAVA_HOME_OKAY
  @ECHO.   JAVA_HOME is not set properly !!!
  @GOTO THE_END
:JAVA_HOME_OKAY

Avatar of s_lavie

ASKER

Same as 3:
Exception in thread "main" java.lang.NoClassDefFoundError: \bin\java
)-;
The problem might be further on in your batch, cause that segment works fine here.
Avatar of s_lavie

ASKER

Here is the original batch file:

@ECHO OFF

@set JAVA_HOME=C:\JavaSoft\JRE\1.3.1_04
@set SERVER_HOME="C:\ProductName\server"

@if EXIST "%JAVA_HOME%\bin\java.exe" GOTO JAVA_HOME_OKAY
   @ECHO.
   @ECHO.  
   @ECHO.   JAVA_HOME is not set properly !!!
   @ECHO.
   @ECHO.   (Please set the JAVA_HOME environment variable)
   @ECHO.
   @ECHO.  
   @PAUSE
   @GOTO THE_END
:JAVA_HOME_OKAY

%JAVA_HOME%\bin\java -Djava.rmi.server.codebase=file:%SERVER_HOME%\server.jar -Djava.security.policy=file:%SERVER_HOME%\rmi.policy -jar server.jar

@ECHO ON
ASKER CERTIFIED SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of s_lavie

ASKER

Great!
While in this subject, I wonder whether you have something for this (extra points is a promise):

In my policy file:

grant
{
 // Allow everything for now
 permission java.net.SocketPermission  "*:1024-65535", "accept, connect, listen";
};

grant codeBase "file:C:/Test/NewFolder/server/-"
{
 permission java.security.AllPermission;
};
It runs OK (when folder name has no spaces)!

For:
grant codeBase "file:C:/Test/New Folder/server/-"
{
 permission java.security.AllPermission;
};
It throws:
RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.net.MalformedURLException: no protocol: Folder\server\server.jar in Server::main()

For:
grant codeBase file:C:/Test/New Folder/server/-
{
 permission java.security.AllPermission;
};
It throws:
access denied (java.net.SocketPermission 127.0.0.1:1199 connect,resolve) in Server::main()
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1199 connect,resolve)
I would have thought the following was correct:

grant codeBase "file:C:/Test/New Folder/server/-"
{
permission java.security.AllPermission;
};

The exception you are getting may not be related to the policy entry. And you are just experiencing it because the (bad) code is getting permission to execute.
Avatar of s_lavie

ASKER

Is it "possible" that the same (bad) code would work for:
grant codeBase "file:C:/Test/NewFolder/server/-"
{
permission java.security.AllPermission;
};
???
(Of course its possible, everything is possible with software, but does it make sense?)
Maybe as the url that it is blowing up on will be different. Find where that URL is specified and u may find your problem :)
Avatar of s_lavie

ASKER

This line:
Naming.bind("//localhost:1099/MgmtServer");
Causes:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
        java.net.MalformedURLException: no protocol: Folder\server\server.jar
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:

        java.net.MalformedURLException: no protocol: Folder\server\server.jar
java.net.MalformedURLException: no protocol: Folder\server\server.jar
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
        at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
        at sun.rmi.server.UnicastRef.invoke(Unknown Source)
        at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
        at java.rmi.Naming.bind(Unknown Source)
        at Server.main(Server.java:98)

... when using "New Folder", but works fine for "NewFolder" - any obvious reason?
I think the exception is actually being thrown on the server (when the client tries to connect).
Maybe the codebase used to start your server.
Avatar of s_lavie

ASKER

The client is not trying to connect.
The exception is being thrown when the server is loaded...
Avatar of s_lavie

ASKER

> Maybe the codebase used to start your server.
I guess it is (I use the above batch file):

@set SERVER_HOME="C:\Test\New Folder\server"

"%JAVA_HOME%\bin\java" -Djava.rmi.server.codebase=file:%SERVER_HOME%\server.jar -Djava.security.policy=file:%SERVER_HOME%\rmi.policy -jar server.jar
Avatar of s_lavie

ASKER

Should I use the codebase to start the server?
If I don't it seems to work fine ;-)
Try:

@set SERVER_HOME=C:\Test\New Folder\server

"%JAVA_HOME%\bin\java" -Djava.rmi.server.codebase="file:%SERVER_HOME%\server.jar" -Djava.security.policy="file:%SERVER_HOME%\rmi.policy" -jar server.jar
Avatar of s_lavie

ASKER

Well, I guess I'll skip the codebase when starting my server.
Unless you think it's a bad idea...
did the above batch changes help?
Avatar of s_lavie

ASKER

No )-;
What is the purpose of starting the server with the codebase, anyway? (I just saw that in an example)
Avatar of s_lavie

ASKER

Thanks.