Cum se stabilește o cale lungă de clasă Java în Windows?

Încerc să rulez manual un test JUnit pe o linie de comandă Windows XP, care are un număr neobișnuit de mare de elemente în calea de clasă. Am incercat mai multe variante, cum ar fi:

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;....
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;....
...
C:\apps\jdk1.6.0_07\bin\java.exe -client oracle.jdevimpl.junit.runner.TestRunner com.myco.myClass.MyTest testMethod

(Alte variante fac setarea traseului de clasă pe o singură linie, setând classpath via -classpath ca argument la java "). Intotdeauna se coboară la consola care aruncă mâinile cu această eroare:

The input line is too long.
The syntax of the command is incorrect.

Acesta este un test JUnit care testează un proiect de moștenire existent destul de mare, astfel că nu există sugestii privind rearanjarea structurii directorului meu la ceva mai rezonabil, acele tipuri de soluții sunt scoase pentru moment. Încercam doar să fac un test rapid împotriva acestui proiect și să-l execut pe linia de comandă, iar consola mă piere. Ajutor!

34

9 răspunsuri

Linia de comandă Windows este foarte limitantă în această privință. O soluție este de a crea un "borcan de cale". Acesta este un borcan care conține numai un fișier Manifest.mf , al cărui Cale de clasă specifică căile de disc ale listei lungi de borcane etc. Acum adăugați doar acest traseul pe linia de clasă a liniei de comandă. Aceasta este, de obicei, mai convenabilă decât ambalarea împreună a resurselor reale.

După cum îmi amintesc, căile de discuri pot fi relativ la jarul de călătorie . Deci, Manifest.mf ar putea arata cam asa:

Class-Path: this.jar that.jar ../lib/other.jar

În cazul în care jarul de călătorie conține în principal resurse fundamentale, atunci nu se va schimba prea frecvent, dar probabil că veți dori să îl generați undeva în clădirea dvs. De exemplu:


  
    
  

49
adăugat
Trebuie să fac ceva, de exemplu, să vă asigur că acest borcan este încărcat? Sau JVM va scana toate borcanele furnizate pe calea clasei pentru astfel de manifeste? De asemenea, este portabil în JVM-uri? Care este versiunea minimă a Java care acceptă acest lucru?
adăugat autor bacar, sursa
Sarcina ManifestClassPath disponibilă în Ant din versiunea 1.7 poate fi utilizată pentru a genera o proprietate potrivită pentru atributul Class-Path de la o cale Ant.
adăugat autor Matt Hurne, sursa
Am încercat acest lucru, dar Manifest.mf permite doar adresele URL relativ pentru alte JAR-uri și directoare.
adăugat autor xamde, sursa

Din Java 6 puteți folosi metacaracte classpath .

Example: foo/*, refers to all .jar files in the directory foo

  • aceasta nu se va potrivi cu fișiere de clasă (numai fișiere jar). Pentru a se potrivi ambele utilizați: foo; foo/* sau foo/*; foo . Ordinea determină mai întâi încărcarea.
  • Căutarea nu este recursivă
18
adăugat
Acest lucru pare a fi un "Răspuns Numai Link". Ar trebui să oferiți mai multe detalii despre cum să faceți acest lucru.
adăugat autor rghome, sursa
Hei, e cool - nu știam despre asta. Aceasta este cu siguranță o opțiune utilă, mai ales dacă (ca în cazul nostru), calea de clasă este plină de borcane, multe dintre ele fiind în același director.
adăugat autor Ogre Psalm33, sursa
Acest lucru pare să fie nou în Java 6.
adăugat autor Chris Noe, sursa
Dar acest lucru nu oferă traversări recursive.
adăugat autor Snehal Masne, sursa

(Presupun că nu prea însemnați DOS, ci trimiteți-vă la cmd.exe.)

Cred că este mai puțin o limitare CLASSPATH decât o limită a mărimii variabilei dimensiune/mediul de mediu. Pe XP, variabilele individuale de mediu pot avea o dimensiune de 8k, întregul mediu este limitat la 64k. Nu văd că veți atinge această limită.

Există o limită pentru ferestrele care restricționează lungimea unei linii de comandă, pe WindowsNT + este de 8k pentru cmd.exe. O comandă setată este supusă restricției respective. Poate aveți mai mult de 8k în directoare în comanda setată? S-ar putea să aveți noroc, atunci - chiar dacă le-ați împărțit ca pe Nick Berardi a sugerat.

4
adăugat
Woops, da, vechiul școală se strecoară. Da, cmd.exe.
adăugat autor Ogre Psalm33, sursa

Ați încercat să le stivuiți?

set CLASS_PATH = c:\path
set ALT_A = %CLASS_PATH%\a\b\c;
set ALT_B = %CLASS_PATH%\e\f\g;
...

set ALL_PATHS = %CLASS_PATH%;%ALT_A%;%ALT_B%
2
adăugat
Am încercat câteva variante de acest lucru, fără nici un rezultat. CMD pare să înlocuiască toate acele% ALT_A%, etc pe-the-fly și calea finală se încheie fiind prea lungă pentru a se ocupa, dându-mi aceeași eroare.
adăugat autor Ogre Psalm33, sursa

If I were in your shoes, I would download the junction utility from MS : http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx and then map your "C:\path" to say, "z:\" and "c:\path2" to say, "y:\". This way, you will be reducing 4 characters per item in your classpath.

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;

Now, your classpath will be :

set CLASS_PATH=z\a\b\c;z\e\f\g;
set CLASS_PATH=%CLASS_PATH%;y:\a\b\c;y:\e\f\g;

S-ar putea face mai mult în funcție de clasa classpath .

1
adăugat
Junction este un front-end pentru acest lucru în NTFS. mklink/D este altul, poate fi deja prezent în versiunile ulterioare de Windows.
adăugat autor mgaert, sursa
mlink nu pare să fie inclus pe fereastra 7. joncțiunea este inclusă ca parte a ferestrelor 7 (enterprise).
adăugat autor anjanb, sursa

Așa cum menționează HuibertGill, aș împacheta acest lucru într-un scenariu de construcție Ant, doar pentru ca tu să nu trebuiască să te ocupi de toate astea.

0
adăugat

Cred că te afli în pârâu fără vreo bară aici. Linia de comandă are o limită de argumentare pentru a apela un program.

Am 2 sugestii pe care le-ai putea încerca. Mai întâi, înainte de a rula testele junit, puteți lăsa un script/ant_task să creeze JAR-uri ale diferitelor clase pe calea de clasă. Apoi puteți pune JAR-urile în clasă, care ar trebui să fie mai scurte.

Un alt mod de a încerca este să creați un antiscript pentru a rula JUNIT, în ANT nu ar trebui să existe o astfel de limită pentru intrările în clasă.

0
adăugat

Ai putea încerca asta


@echo off
set A=D:\jdk1.6.0_23\bin
set B=C:\Documents and Settings\674205\Desktop\JavaProj
set PATH="%PATH%;%A%;"
set CLASSPATH="%CLASSPATH%;%B%;"

mergeți la un prompt de comandă și rulați-l de două ori (nici o idee de ce .... trebuie să fac acest lucru pe o mașină Windows XP) de asemenea, căile r setate numai pentru sesiunea de comandă a promptului de comandă

0
adăugat

Nu a existat nici o soluție la problemă, altul decât cumva făcând calea de clasă mai scurtă prin mutarea fișierelor într-un folder ca "C: \ borcane".

0
adăugat
Incorect. A fost o altă soluție, dar nici nu știați ce a fost sau ați decis să nu o utilizați. Cu toate acestea, ceea ce ați făcut a fost cu siguranță o soluție ... care poate funcționa în anumite circumstanțe.
adăugat autor Stephen C, sursa