Portál AbcLinuxu, 12. května 2025 18:24

Dotaz: spuštění java příkazu pomocí shell scriptu

4.4.2008 12:25 Pev | skóre: 28
spuštění java příkazu pomocí shell scriptu
Přečteno: 1020×
Odpovědět | Admin
Dobrý den,

snažím se pustit tento příkaz ze scriptu
java "-Dahoj=x wee" -cp .:lib/* utils.keystore.tmp.TestConfigKeystore
Ve scriptu tedy mám:
echo java \"-Dahoj=x  wee\" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore
java \"-Dahoj=x  wee\" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore
Problém je, že skript sice vypíše text (java "-Dahoj=x wee" -cp .:lib/* utils.keystore.tmp.TestConfigKeystore), kt. vložený do terminálu jde spustit, ale samotné spuštění ze scriptu skonči chybou:
Exception in thread "main" java.lang.NoClassDefFoundError: "-Dahoj=x
Pozn: účelem je předat java system property, kt. obsahuje mezeru a proto by měla být zapsána takto: "-Dahoj=x wee" (kde dát uvozovky jsem čerpal odsud).

Díky za tipy.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Heron avatar 4.4.2008 12:33 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
"-Dahoj=x wee"

-D je přepínač, zkuste dát ty uvozoky až za něj, tedy -D"ahoj=a hoj".

Heron
4.4.2008 12:39 Pev | skóre: 28
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
To je právě to... co už jsem taky zkoušel předtím než jsem napsal
echo java -D\"ahoj=x  wee\" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore
java -D\"ahoj=x  wee\" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore
a dá to výstup
java -D"ahoj=x wee" -cp .:lib/* utils.keystore.tmp.TestConfigKeystore
Exception in thread "main" java.lang.NoClassDefFoundError: wee"
Jinak ten příkaz java -D"ahoj=x wee" -cp .:lib/* utils.keystore.tmp.TestConfigKeystore spustit opět jde, takže ten samý problém.

Můj první příklad mi přišel taky nelogický, proto jsem rovnou uváděl ten link, odkud jsem čerpal.
Heron avatar 4.4.2008 12:36 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
A také se mi tam nelíbí ta lomítka.
Heron
4.4.2008 12:45 Pev | skóre: 28
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Aha, tak tohle ve skriptu funguje
java -D"ahoj=x  wee" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore
java "-Dahoj=x  wee" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore
Ale abych byl přesnější, potřebuju spustit tento skript (z důvodů, jež nechci rozepisovat, ale proto tam jsou ta lomítka):
i=' "-Dahoj=x  wee" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore'
echo java $i
java $i
a ten dá výstup java "-Dahoj=x wee" -cp .:lib/* utils.keystore.tmp.TestConfigKeystore Exception in thread "main" java.lang.NoClassDefFoundError: "-Dahoj=x

Stejný výstup dá i skript
i=" \"-Dahoj=x  wee\" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore"
echo java $i
java $i
Heron avatar 4.4.2008 13:11 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Tak tohle vypadá na problém v expanzi uvozovek a escape znaků v bashi. V tom se příliš nevyznám. Ale tohle je funkční:
i="-Dahoj=a hoj -Dcau=c a u"
echo $i
java "$i" Prop
Properties se předají.
4.4.2008 13:34 Pev | skóre: 28
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Jo díky, to opravdu jede.

Zajímavé je, že tohle jede
i="-Dahoj=x  wee"
j=" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore"
java "$i" $j
ale tohle už ne
i="-Dahoj=x  wee"
j=" -cp .:lib/*  utils.keystore.tmp.TestConfigKeystore"
java "$i" "$j"
4.4.2008 13:59 alik
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
je to prirozene, ve druhem pripade se procesu predaji pouze dva parametry, nebot mezery v promenne j nejsou interpretovany jako oddelovac parametru - to je ostatne presne ucel tech uvozovek.

jen poznamka - porovnavani s tim co vypise echo je v techto situacich velmi zavadejici, protoze tam hranice parametru nejsou videt.
Heron avatar 4.4.2008 14:09 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
V případě spouštění bash -x ano, první řádek skriptu by vydadal takto:
#!/bin/bash -x
11.4.2008 08:49 Pev | skóre: 28
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Ne, tak takhle volání sice neskončí chybou, ale misto 2 properties se předa jedna ahoj s hodnotou "a hoj -Dcau=c a u".

Takže se budou muset predávat proměnné zvlášť (a to je trochu komplikované tím, že nevím, kolik těch proměnných bude).

Je celý ten problém problémem javy nebo bashe?
11.4.2008 14:32 Jiří Tušla
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
S tímhle se předává libovolnej počet uživatelsky definovanejch proměnnejch

#!/bin/bash 
params="";
for i in `seq 1 10`;
do
        params="${params} \"-Dparam${i}=value with space ${i}\""
done
echo $params
eval "java $params -cp . Main"
Kód příslušného testovacího programu v Javě je tenhle:

import java.util.Enumeration;
import java.util.Properties;
public class Main {   
    public static void main(String[] args) {
        Properties params = System.getProperties();
        Enumeration keys = params.propertyNames();
        while (keys.hasMoreElements()) {
            String key = (String) keys.nextElement();
            System.out.println(key + " => " + params.getProperty(key));
        }
    }
}
11.4.2008 18:24 Pev | skóre: 28
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
Díky za tip.

Já to nakonec vyřešil pomocí polí. Vůbec jsem netušil, že jdou v bashi používat. Pak se proste vezme velikost pole a nemusí se dávat dostatečně velký počet běhů při for (v mém připadě jsem uvažoval o hodnotě 100, s tím, že v některých skriptech by ten běh nebyl nutný vůbec).

Též jiná možnost volání cyklu for mě překvapila.

POLE=("prvni prvek" "druhy prvek")
for ((i=0; i<${#POLE[*]}; $i++)); do
... něco s prvkem $POLE[$i]
done
11.4.2008 20:22 Ash | skóre: 53
Rozbalit Rozbalit vše Re: spuštění java příkazu pomocí shell scriptu
POLE=("prvni prvek" "druhy prvek")
for ((i=0; i<${#POLE[@]}; i++)); do
... něco s prvkem ${POLE[$i]}
done

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.