jar i classpath - (prawie) klasyczny problem

Oglądasz archiwalną wersję wątku "jar i classpath - (prawie) klasyczny problem" z forum pl.comp.lang.java



Krzysiek - 31 Lip 2007, 16:19
Witam

Mam problem z classpath. Dlatego też będę miał kilka pytań i próśb.

1. Czy możecie mi polecić jakiś dobry tutorial w którym przykłady, nie
kończą się na prostych, tylko demonstrują bardziej zaawansowane
umieszczanie różnych rzeczy w jar-ach (np jar-ów we wnętrzu innego jar-a
i umieszczanie w classpath).

2. Tutaj opiszę jakie rozwiązanie mam (ale nie jest ono eleganckie, ani
nie realizuje w pełni tego co bym chciał osiągnąć). Tworzę sobie trzy
pakiety, a w nich swoje klasy:
- package1/myClass1.class
- package2/myClass2.class
- package2/myClass3.class
- package3/myClass4.class

Przy czym myClass3 jest moją Main-Class ( w manifeście mam:
Manifest-Version: 1.0
Main-Class: package2/myClass3.class

Moje klasy korzystają z zewnętrznych jar-ów:
avalon-framework-4.2.0.jar
fop.jar
batik-all-1.6.jar
commons-io-1.1.jar
commons-logging-1.0.4.jar
fop-hyph.jar
serializer-2.7.0.jar
sqljdbc.jar
xalan-2.7.0.jar
xercesImpl-2.7.1.jar
xml-apis-1.3.02.jar
xmlgraphics-commons-1.1.jar

Aby wszystko działało (za radą kolegi) rozpakowałem wszystkie jar-y do
katalogu, gdzie mam już swoje pakiety. Z tego buduję jara, uruchamiam i
działa.

3. Nie działała mi taka sytuacja.
Ze swoich pakietów zbudowałem jar-a (mójJar.jar) z Main-Class:
package2/myClass3.class i umieszczam go w katalogu, gdzie mam wymienione
wyżej jar-y. Próbuję uruchomić mojego jar-a i dostaję błąd:

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/fop/apps/FOPException

mimo, że ta klasa jest w fop.jar (i nie sprawiała problemów gdy
postąpiłem jak w punkcie 2.) Czy ktoś może mi powiedzieć co tu robię źle
i dostaję taki błąd.

4. To chciałbym osiągnąć:

Ze swoich pakietów chciał bym zbudować mójJar.jar. Ze swojego jar-a i
wymienionych wyżej zewnętrznych jarów zbudować jeden duży jar, który
jako Entry Point będzie miał ustawioną klasę package2/myClass3.class
(nie wiem czy tak się da).

Będę wdzięczny za każdą pomoc.

Krzysiek




Karol - 31 Lip 2007, 16:43

Witam

Mam problem z classpath. Dlatego też będę miał kilka pytań i próśb.
[ ... ]
xml-apis-1.3.02.jar
xmlgraphics-commons-1.1.jar

Aby wszystko działało (za radą kolegi) rozpakowałem wszystkie jar-y do
katalogu, gdzie mam już swoje pakiety. Z tego buduję jara, uruchamiam i
działa.



ło matko ;-)

nie lepiej wrzucić biblioteki do katalogu np lib a w manifeście umieścić:
Class-Path: lib/xml-apis-1.3.02.jar lib/xmlgraphics-commons-1.1.jar

rozwiązanie jest eleganckie, zalecane i w ogóle świetne :-)
NB robi to z automatu.

3. Nie działała mi taka sytuacja.
Ze swoich pakietów zbudowałem jar-a (mójJar.jar) z Main-Class:
package2/myClass3.class i umieszczam go w katalogu, gdzie mam wymienione
wyżej jar-y. Próbuję uruchomić mojego jar-a i dostaję błąd:

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/fop/apps/FOPException



java -cp xml-apis-1.3.02.jar:xmlgraphics-commons-1.1.jar -jar mójJar.jar

4. To chciałbym osiągnąć:

Ze swoich pakietów chciał bym zbudować mójJar.jar. Ze swojego jar-a i
wymienionych wyżej zewnętrznych jarów zbudować jeden duży jar, który
jako Entry Point będzie miał ustawioną klasę package2/myClass3.class
(nie wiem czy tak się da).



jeszcze raz powtórzę - ŁO MATKO
proponuję rozwiązanie z Class-Path:
martwisz się wtedy tylko o swojego jara i oto, żeby w lib leżały właściwe
jary, z całości robisz instalator albo pakujesz jakimś pakerem i po
problemie



zywy - 31 Lip 2007, 17:16


| Aby wszystko działało (za radą kolegi) rozpakowałem wszystkie jar-y do
| katalogu, gdzie mam już swoje pakiety. Z tego buduję jara, uruchamiam i
| działa.

ło matko ;-)



ee.. tez tak robilem binary distribution i nie bolalo ;-P

| 4. To chciałbym osiągnąć:

| Ze swoich pakietów chciał bym zbudować mójJar.jar. Ze swojego jar-a i
| wymienionych wyżej zewnętrznych jarów zbudować jeden duży jar, który
| jako Entry Point będzie miał ustawioną klasę package2/myClass3.class
| (nie wiem czy tak się da).



porzebowalbys specjalny classloader - z tego co wiem zwykly nei
znajdzie ci klas w zagniezdzonym jarze, ale zaloze sie, ze nie o to tu
chodzi :) generalnie masz jednego jara -prostsyz skrypt do
uruchmoenia, wiecej jarow -wiecej mykow wymaganych z ustawianiem
classpath



zywy - 31 Lip 2007, 17:40



| Ze swoich pakietów chciał bym zbudować mójJar.jar. Ze swojego jar-a i
| wymienionych wyżej zewnętrznych jarów zbudować jeden duży jar, który
| jako Entry Point będzie miał ustawioną klasę package2/myClass3.class
| (nie wiem czy tak się da).



z teg oco widze http://one-jar.sourceforge.net/ uzywa wlasnie wlasnego
classloadera, zeby osiagnac to o co pytasz

Pzdr.
Maciek




oczek - 1 Sie 2007, 02:46

ee.. tez tak robilem binary distribution i nie bolalo ;-P

porzebowalbys specjalny classloader - z tego co wiem zwykly nei
znajdzie ci klas w zagniezdzonym jarze, ale zaloze sie, ze nie o to tu
chodzi :) generalnie masz jednego jara -prostsyz skrypt do
uruchmoenia, wiecej jarow -wiecej mykow wymaganych z ustawianiem
classpath



pozostaje jeszcze temat obostrzeń licencyjnych, wielu twórców bibliotek
zastrzega że mogą one być rozpowszechniane w takiej formie w jakiej
zostały przez nich udostępnione, a nie rozpakowane i przepakowane do
innego jara



Piotr Kobzda - 1 Sie 2007, 04:11


| Exception in thread "main" java.lang.NoClassDefFoundError:
| org/apache/fop/apps/FOPException

java -cp xml-apis-1.3.02.jar:xmlgraphics-commons-1.1.jar -jar mójJar.jar



To nie zadziała.

Cytat odnośnie opcji -jar:

"When you use this option, the JAR file is the source of all user
classes, and other user class path settings are ignored."

http://java.sun.com/javase/6/docs/technotes/tools/windows/java.html#-jar

Do OP:

Jest sporo narzędzi do robienia tego co chcesz osiągnąć (fatjar, onejar,
uberjar, ... ).  Nie trudno też samemu odpowiedni do potrzeb launcher

Podobnie jednak jak inni tu uważam, że jeśli tylko nie masz specjalnych
wymagań, najlepsze rozwiązanie to "standard way", opisywane dość dobrze
w dokumentacji JDKa i różnych podwiązanych dokumentach, np.:

http://java.sun.com/docs/books/tutorial/deployment/jar/

Warto też zajrzeć tam:

http://mindprod.com/jgloss/jar.html

piotr



Krzysiek - 1 Sie 2007, 04:37
Dzięki za odpowiedź. Przeprowadziłem próby twoich rozwiązań. Efekty poniżej.

| Witam

| Mam problem z classpath. Dlatego też będę miał kilka pytań i próśb.

[ ... ]
| xml-apis-1.3.02.jar xmlgraphics-commons-1.1.jar

| Aby wszystko działało (za radą kolegi) rozpakowałem wszystkie jar-y
|  do katalogu, gdzie mam już swoje pakiety. Z tego buduję jara,
| uruchamiam i działa.
ło matko ;-)

nie lepiej wrzucić biblioteki do katalogu np lib a w manifeście
umieścić: Class-Path: lib/xml-apis-1.3.02.jar
lib/xmlgraphics-commons-1.1.jar

rozwiązanie jest eleganckie, zalecane i w ogóle świetne :-) NB robi
to z automatu.



Zrobiłem tak:
w katalogu abc założyłem katalog lib i tam wrzuciłem wszystkie obce jar.
Do katalogu abc dodatkowo skopiowałem moje pakiety i zrobiłem  katalog
META-INF a w nim plik MANIFEST.MF o zawartości:

Manifest-Version: 1.0
Class-Path: avalon-framework-4.2.0.jar batik-all-1.6.jar
   commons-io-1.1.jar commons-logging-1.0.4.jar
   fop-hyph.jar fop.jar serializer-2.7.0.jar
   sqljdbc.jar xalan-2.7.0.jar xercesImpl-2.7.1.jar xercesImpl.jar
   xml-apis-1.3.02.jar xmlgraphics-commons-1.1.jar
Main-Class: package2/myClass3

zawartość katalogu abc spakowałem do pliku mojJar.jar i wywołałem:

java -jar mojJar.jar

Rezultat jest taki:
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/fop/apps/FOPException

| 3. Nie działała mi taka sytuacja. Ze swoich pakietów zbudowałem
| jar-a (mójJar.jar) z Main-Class: package2/myClass3.class i
| umieszczam go w katalogu, gdzie mam wymienione wyżej jar-y. Próbuję
|  uruchomić mojego jar-a i dostaję błąd:

| Exception in thread "main" java.lang.NoClassDefFoundError:
| org/apache/fop/apps/FOPException

java -cp xml-apis-1.3.02.jar:xmlgraphics-commons-1.1.jar -jar
mójJar.jar



W katalogu z moim jarem i z zewnętrznymi jarami wywołałem:

java -cp
avalon-framework-4.2.0.jar:fop.jar:batik-all-1.6.jar:commons-io-1.1.jar:commons-logging-1.0.4.jar:fop-hyph.jar:myUtility.jar:serializer-2.7.0.jar:sqljdbc.jar:xalan-2.7.0.jar:xercesImpl-2.7.1.jar:xercesImpl.jar:xml-apis-1.3.02.jar:xmlgraphics-commons-1.1.jar
-jar mojJar.jar

Efekt:

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/fop/apps/FOPException

Zastanawiam się czy fop.jar jest w porządku skoro otrzymuję takie błędy.
Dodam jeszcze, że z poziomu Eclipse program uruchamia się bez problemów.



Krzysiek - 1 Sie 2007, 04:42

java -cp
avalon-framework-4.2.0.jar:fop.jar:batik-all-1.6.jar:commons-io-1.1.jar:commons-logging-1.0.4.jar:fop-hyph.jar:myUtility.jar:serializer-2.7.0.jar:sqljdbc.jar:xalan-2.7.0.jar:xercesImpl-2.7.1.jar:xercesImpl.jar:xml-apis-1.3.02.jar:xmlgraphics-commons-1.1.jar
-jar mojJar.jar



Próbowałem też ze średnikami jako znakiem rozdzielającym jary:

java -cp
avalon-framework-4.2.0.jar;fop.jar;batik-all-1.6.jar;commons-io-1.1.jar;commons-logging-1.0.4.jar;fop-hyph.jar;serializer-2.7.0.jar;sqljdbc.jar;xalan-2.7.0.jar;xercesImpl-2.7.1.jar;xercesImpl.jar;xml-apis-1.3.02.jar;xmlgraphics-commons-1.1.jar
-jar mojJar.jar



Szarak - 1 Sie 2007, 04:48

w katalogu abc założyłem katalog lib i tam wrzuciłem wszystkie obce jar.
Do katalogu abc dodatkowo skopiowałem moje pakiety i zrobiłem  katalog
META-INF a w nim plik MANIFEST.MF o zawartości:



W katalogu abc masz mieć tylko swojego jara z odpowiednim manifestem i
katalog lib z obcymi jarami. To nie ma być spakowane do jednego jara.

Pozdrawiam
Szarak



Piotr Kobzda - 1 Sie 2007, 04:55

Zrobiłem tak:
w katalogu abc założyłem katalog lib i tam wrzuciłem wszystkie obce jar.
Do katalogu abc dodatkowo skopiowałem moje pakiety i zrobiłem  katalog
META-INF a w nim plik MANIFEST.MF o zawartości:

Manifest-Version: 1.0
Class-Path: avalon-framework-4.2.0.jar batik-all-1.6.jar
  commons-io-1.1.jar commons-logging-1.0.4.jar
  fop-hyph.jar fop.jar serializer-2.7.0.jar
  sqljdbc.jar xalan-2.7.0.jar xercesImpl-2.7.1.jar xercesImpl.jar
  xml-apis-1.3.02.jar xmlgraphics-commons-1.1.jar
Main-Class: package2/myClass3



Skoro wrzuciłeś to wszystko do lib, to i opowiedz o tym Javie -- dodanie
'lib/' przed każdą nazwą jara powinno pomóc.

piotr



Krzysiek - 1 Sie 2007, 05:56


| Zrobiłem tak:
| w katalogu abc założyłem katalog lib i tam wrzuciłem wszystkie obce jar.
| Do katalogu abc dodatkowo skopiowałem moje pakiety i zrobiłem  katalog
| META-INF a w nim plik MANIFEST.MF o zawartości:

| Manifest-Version: 1.0
| Class-Path: avalon-framework-4.2.0.jar batik-all-1.6.jar
|   commons-io-1.1.jar commons-logging-1.0.4.jar
|   fop-hyph.jar fop.jar serializer-2.7.0.jar
|   sqljdbc.jar xalan-2.7.0.jar xercesImpl-2.7.1.jar xercesImpl.jar
|   xml-apis-1.3.02.jar xmlgraphics-commons-1.1.jar
| Main-Class: package2/myClass3

Skoro wrzuciłeś to wszystko do lib, to i opowiedz o tym Javie -- dodanie
'lib/' przed każdą nazwą jara powinno pomóc.

piotr



Faktycznie nie dodałem 'lib/'. Teraz działa. Dziękuję wszystkim za
zainteresowanie i pomoc.


String line; if (line=="cos"){...}....problem
StringBuffer to String - problem z czasem konwersji
problem z typem generycznym w tablicy Vector<String>[] data = new Vector[n];
Ciekawe pytanie o kolory
  • pielegniarki opieka kielce
  • czemu po moim routerze jest getaway a potem
  • kretynskie smsy od roznych reklamodawcow
  • smieszne teksty historie
  • drzewka do kupienia
  • katowice awf fizjoterapia egzaminy
  • java;warcaby
  • tunezyjski aar 1066 1820
  • o symbianie na powaC2 nie czyli
  • Zbieranina wiadomości z for dyskusyjnych || Indeks