Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[Java/Linux] classpath niet herkend via Runtime.execute(...)

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als ik in Linux (Ubuntu) vanuit Java een commando uitvoer d.m.v. Runtime.Execute(String), dan werkt het prima, totdat ik het huidige classpath meegeef in het commando.

Bijv. het commando (waarbij ik een nieuw classpath meegeef) werkt prima:

code:
1
Runtime.getRuntime().exec("java -cp /home/tmp/junit.jar pacman.TestAll");


Maar het volgende commando (waarbij ik het huidige classpath meegeef, dat ook de junit.jar bevat) werkt niet. Hij is dan niet in staat om de klassen te lokaliseren.

code:
1
Runtime.getRuntime().exec("java -cp $CLASSPATH pacman.TestAll");


Als ik echter het commando

code:
1
java -cp $CLASSPATH pacman.TestAll


handmatig uitvoer in de terminal (dus zonder Runtime.execute), dan werkt het wel naar behoren.

Iemand een idee waar dit aan ligt?

Edit: onder Windows doet dit probleem zich niet voor.

[ Voor 3% gewijzigd door Verwijderd op 13-08-2008 22:33 ]


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Het is volgens mij onder linux (en unix) zo dat het omzetten van $CLASSPATH naar de waarde van de environment-variable CLASSPATH een functie is van je shell. Als je Runtime.exec(...) gebruikt wordt die opdracht niet binnen je shell uitgevoerd. De door jou gewenste werking is op deze wijze denk ik niet mogelijk.

Wat wel zou kunnen werken is het maken van het volgende (ongetest!):
Java:
1
2
3
4
5
6
String[] cmd = new String[4];
cmd[0] = "java";
cmd[1] = "-cp " + System.getEnv("CLASSPATH");
cmd[2] = "test";
cmd[3] = "pacman.TestAll"
Runtime.getRuntime().exec(cmd);


Daarnaast is het misschien mogelijk om een shell te starten en direct de opdracht te geven (iets als /bin/bash java -cp $CLASSPATH .... ), al weet ik niet zeker of dit onder Linux gaat (onder Windows heb je zoiets met cmd.exe /s).

Overigens: waarom voer je dit niet gewoon uit binnen je bestaande java proces?

Nog een terzijde: volgens mij gebruikt java altijd de waarde in de environment variable CLASSPATH, dus dit lijkt mij een beetje overbodig, toch.

[ Voor 23% gewijzigd door Remus op 13-08-2008 22:43 ]


Verwijderd

Topicstarter
Ik heb het probleem opgelost door System.getenv("CLASSPATH") te gebruiken om de waarde van de CLASSPATH variabele op te vragen. Hartelijk dank daarvoor. :)

"Overigens: waarom voer je dit niet gewoon uit binnen je bestaande java proces?"

Vanuit het bestaande Java proces moet ik AspectJ gebruiken (ajc) en een JUnit test suite runnen. Volgens mij kan dat alleen door die commando's extern aan te roepen d.m.v. Runtime.Execute(..). Correct me if I'm wrong.

"Nog een terzijde: volgens mij gebruikt java altijd de waarde in de environment variable CLASSPATH, dus dit lijkt mij een beetje overbodig, toch."

Dit was enkel een voorbeeld. Het is de bedoeling dat er een nieuwe JAR (gegenereerd door het externe ajc commando) aan het begin van de bestaande CLASSPATH variabele wordt toegevoegd, bijv. out.jar:$CLASSPATH. Die out.jar is nodig voor het daaropvolgende externe commando (runnen van een JUnit test suite).

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Verwijderd schreef op woensdag 13 augustus 2008 @ 23:16:
Ik heb het probleem opgelost door System.getenv("CLASSPATH") te gebruiken om de waarde van de CLASSPATH variabele op te vragen. Hartelijk dank daarvoor. :)
Mooi :)
"Overigens: waarom voer je dit niet gewoon uit binnen je bestaande java proces?"

Vanuit het bestaande Java proces moet ik AspectJ gebruiken (ajc) en een JUnit test suite runnen. Volgens mij kan dat alleen door die commando's extern aan te roepen d.m.v. Runtime.Execute(..). Correct me if I'm wrong.
Het ligt grotendeels aan je eisen en omstandigheden, maar in principe kan je iedere Java-applicatie ook gewoon binnen een andere applicatie opstarten door de main-methode aan te roepen. Of dit veilig is ligt natuurlijk aan de programma's en of dit werkt ligt aan de classpath en evt de ClassLoader (maar dat valt grotendeels buiten mijn kennis en ervaring).