"could not find the main class" na komputerach bez JDK

0

Witam,

Mam problem z obsługą plików jar na komputerach, na których nie ma zainstalowanego JDK. Sprawdzałem 3 różnych komputerach u 3 różnych osób i u każdej pokazuje się błąd "Could not find the main class: nazwa. Program will exit. Nie używam żadnego środowiska programistycznego, jestem początkującym programistą, problem ten występuje dla każdego programu jaki napiszę.
Na komputerach z JDK wszystkie programy działają bez najmniejszego problemu, zarówno z poziomu konsoli, pliku jar, jak i odpaleniu jara z konsoli lub pliku bat.

Szukam rozwiązania na ten problem od kilku dni, jednak nic nie pomogło, z góry dziękuję za pomoc.

0

A czy w tym jarze masz poprawny manifest i poprawne ścieżki?

0

Tak, jak już wspominałem, programy te chodzą bez żadnych problemów na komputerach z zainstalowanym JDK. Czy może to być wina tego, że cala zawartość jest po prostu wrzucona do jara bez używania pakietów?

0

Porównaj wartość zmiennej środowiskowej CLASSPATH na komputerach na których działa, z tymi na których nie działa.

0

Niestety nie znalazłem zmiennej "CLASSPATH" w zmiennych środowiskowych na żadnym z komputerów.

Rozumiem, że w przypadku teoretycznych różnic w tej zmiennej na różnych komputerach, musiałbym zmienić tą zmienną na komputerze, którego używam do programowania?
Konieczność zmieniania zmiennych środowiskowych za każdym razem jak chcę użyć aplikacji na innym komputerze wydaje się być trochę niepraktyczna.

0

Podaj wyniki poszczegolnych polecen:

  1. java -version (na Twoim kompie)
  2. java -version (na kompie na ktorym nie dziala
  3. jar tf <plik.jar> (powinno pokazac liste plikow w jarze
  4. jar xf META-INF/MANIFEST.MF && cat META-INF/MANIFEST.MF (wzglednie otworz ten plik w jakims notatniku i wklej jego zawartosc)
  5. co sie dzieje jak robisz: java -jar <plik.jar>
  6. co sie dzieje jak robisz: java -cp <plik.jar> <klasa z="z" main="main"> (wg. tego co npaisales wczesniej, klasa z main to 'nazwa')
0

Dziękuje wszystkim za pomoc, rozwiązałem problem naprowadzony na rozwiązanie zapytaniem o wersje javy.
Okazało się, że JDK było w wersji 7 a JRE na komputerach, na których nie działały programy w wersji 6 ponieważ, jak udało mi się wyczytać w internecie, java w wersji 7 jest na razie udostępniana tylko dla programistów albo dla użytkowników, którzy "ręcznie" po nią sięgną.
Tu pojawia się drugie moje pytanie. Skoro większość ludzi posiada starszą wersję od mojego JDK to jak mogę dopasować program do wersji 6? A może powinienem zaopatrzyć się w starszą wersję JDK?

0

javac ma dwa switche:
-source release
Specifies the version of source code accepted. The following values for release are allowed(...)
oraz
-target version
Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM. Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).
The default for -target depends on the value of -source(...)

W ten sposob ustawiasz sobie wersje kod zrodlowy (np. jesli ustawisz 1.6 to kompilator wypluje bledy gdy uzyjesz nowosci z Java 7, np. try z zasobami czy inne) oraz wersje bytecodu ktory ma byc generowany - dla 1.6 / 6 wygeneruje taki ktory zadziala na starszych JVM (oczywiscie tylko 6, ale mozna zejsc jeszcze nizej).

Ciekawi mnie ze blad ktory dostawales to ten ktory mowi o braku klasy a nie cos w stylu: 'class level 51, expected 50' czy costam w tym stylu. No ale wazne ze dziala.

Jeszcze taka ciekawostka - da sie napisac progem w wyzszej wersji Java, skompilowac do bytecodu dla nizszej JVM, ale i tak moze nie dzialac - jesli korzystasz z jakichs method / klas ktore sa dostepne od 7. Wtedy dostaniesz ClassNotFoundException albo NoSuchMethodError czy podobne.
Z doswiadczenia wiem ze sa to bledy dosc trudne do zrozumienia jak sie o nich nie wie - np. ja przed paroma laty miale taki projekt, ktory mial chodzic na WebSphere 6 (tam byla java od IBM w wersji 1.4 pakowana), a program rozwijalismy pod JDK 5 plus tomcat (websphere nie nadawal sie do ciaglego redeploymentu, i to wolne swinstwo bylo). Mimo ustawienia poziomu kodu na 1.5 i targetu na 1.4, program sie sypal. Okazalo sie ze problemem byla metoda java.lang.Boolean.parseBoolean, ktorej w 1.4 jeszcze nie bylo ;d

0

Z ciekawosci sprawdzilem, wyglada na to ze nie podales wszystkich informacji. Skompilowalem klase w JDK 7, utworzylem jar i uruchomilem w java w wersji 6 i oto co dostalem:

Exception in thread "main" java.lang.UnsupportedClassVersionError: Test : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: Test. Program will exit.

Jak widac, Twoj blad to ostatnia z linijek. Na przyszlosc wklejaj cale stack reacy, poniewaz pierwsza linijka by pozwolila kazdemu wypowiadajacemu sie w tym temacie dac jednoznaczna i dobra odpowiedz na temat tego, co robisz zle.

0

Faktycznie, przepraszam, mogło być o wiele łatwiej.
Przy próbie kompilacji z ustawieniem -source wyskakuje mi ostrzeżenie : "warning: [options] bootstrap class path not set in conjuction with -source 1.6 -target 1.6 nazwa.java"
W internecie znalazłem jedynie:
"Set the bootclasspath to compile against the rt.jar (or equivalent) for the older platform. " i
"-bootclasspath bootclasspath
Cross-compile against the specified set of boot classes. As with the user class path, boot class path entries are separated by semicolons (;) and can be directories, JAR archives, or ZIP archives."
Jednak nie mogę wpaść na to jak i na co to ustawić.

0

Olej to, to tylko warning.
Bootclasspath to np rt.jar ktory siedzi w lib w katalogu javy, plus pare innych rzeczy.

0

Ok, działa. Wielkie dzięki za pomoc i poświęcony czas ;)

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