Klasy pakietu poza plikiem jar

0

Z dość dziwnych powodów chciałbym by pewne klasy należące do pakietu a.b.c nie były umieszczone w pliku xxx.jar (zawierającym pozostałe pliki pakietu a.b.c. oraz inne pakiety).
Wyróżnione klasy znajdują się w katalogu sss.
Naturalne rozwiązania:
java -cp sss -jar xxx.jar
oraz
System.setProperty("java.class.path",sss+";"+System.getProperty("java.class.path"));
nie działają. Podczas próby użycia wyróżnionej klasy z pakietu a.b.c wyrzucany jest wyjątek ClassNotFoundException.
Jeśli program jest uruchamiany z niespakowanych klas, to oba podane rozwiązania działają.

Bogdan S.

</u>
0

patrz tutaj: http://4programmers.net/Forum/viewtopic.php?id=113860 - cos podobnego chyba

poza tym jesli uzywasz java -jar to -cp jest ignorowane, uzywane jest Class-path z manifestu w jarze. W twoim przypadku podejrzewam ze nie masz manifestu wiec mozesz zrobic jak:

java -cp sss;jakis_jar glowna_klasa_z_main

0

Nie zgadłeś, próbowałem z Class-Path w manifeście. Też nie działało.
Jeśli nawet -cp jest ignorowane, to dlaczego nie działa
System.setProperty("java.class.path",sss+";"+System.getProperty("java.class.path")); ?
Zmienna systemowa java.class.path ma po powyższym wywołaniu poprawną wartość (tzn. zawiera katalog sss).
Mam podejrzenia, że przyczyna tkwi z sposobie kompilacji: pliki, które są w jarze są kompilowane w Eclipse.
Pliki z katalogu sss są kompilowane z ręki. Pliki *.class otrzymane z Eclipse i z ręki są różne. Natomiast otrzymane po dekompilacji (JAD) pliki żródłowe są identyczne.
Bogdan

0

Nie dziala poniewaz (przynajmniej w sunowej javie) zaraz na starcie wirtualnej maszyny tworzone sa instancje dwoch nieudokumentowanych classloaderow: jeden dla classpath a drugi dla extensions. Sa to proste podklasy URLClassLoader, ktore do konstruktora maja podawane:

  • pierwszy ma podawane wszystkie katalogi i jary w postaci URL ktore odczytywane sa z classpath
  • drugi (extensions) wszystkie jary ktore znajduja sie w JAVA_HOME/lib/ext i te ktore podasz jako zmienna systemowa java.ext.dirs (od javy 6 moze miec wiecej niz jeden katalog)

Zatem mozesz korzystac tylko z klas ktore one widzialy w momencie utworzenia. Pozniej te zmienne juz sie do niczego nie przydaja, wiec nawet jesli robisz updejt classpath za pomoca System.setProperty to i tak nic to nie pomoze.
Jesli koniecznie chcesz zeby dynamicznie tworzyc classpath, mozesz utworzyc taki kod na starcie:
ClassLoader myCl = new URLClassLoader(new File("sss").toURI().toURL()), ClassLoader.getSystemClassLoader());
teraz swoje dynamicznie dodane klasy do classpath mozesz wgrywac np tak:
Class<Klasa> cl = myCl.loadClass("Klasa");

Nie sadze jednak ze o to ci chodzi, nie dziala tak jak podawalem wczesniej? Kompilacja w Eclipse i samodxielnie Javac nie ma znaczenia, a roznia sie dlatego ze eclipse ma swoj wlasny kompilator.
Pozdrawiam

0

Chyba się mylisz co do kompilatorów. Jeśli zastąpię klasę skompilowaną ręcznie klasą kompilowaną przez Eclipse, to jest ona widziana.
Co do ClassLoaderów też chyba nie masz racji - wszystkie klasy z katalogu sss są ładowane poprzez
Class.forName(). Skompilowane ręcznie wyrzucają wyjątek, skompilowane w Eclipse nie.
Pozdrawiam
Bogdan S.

0

no to chyba masz "zepsutego" eclipsa hahaha

0

Dzięki pikseloza, właśnie o coś takiego chodziło.
Rozwiązanie z loaer.loadClass("Klasa"); działa!
(z katalogu sss program używa klas, których w sporej części nie ma gdy program startuje, program
sobie w chwilach wolnych tworzy kod i go kompiluje)
Pozdrawiam

0

No tera to juz nie wiem, przedtem napisales ze zle mowie a teraz ze dziala. Co dokladnie dziala? Tworzyles wlasnego classloadera czy nie?
Pozdrawiam

0

Przepraszam za niejasne wypowiedzi
Działa z własnym loaderem
Pozdrawiam

0

no to luz, ciesze sie ze moglem pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1