Tworzenie własnej bibioteki. Plik class działa, plik jar nie działa.

0

Nie wiem jak dołączyć własną bibliotekę w pliku jar. Ale nie chcę tego robić w NetBeans, bo tam umiem. Chcę z pewnych powodów zrobić to w linii poleceń czystym JDK i Notepadem++ (Windows 7).

Specjalnie zrobiłem najprostszy program (notepad++, zero IDE). Struktura plików i katalogów to:
D:\Klasa.java <- to klasa główna
D:\jlib\Zegar.java <- to biblioteka

Dam treść plików, bo może coś od tego zależy, chociaż wątpię.
Klasa.java:

import jlib.Zegar;
public class Klasa{
	public static void main (String args[]){
		System.out.println("Hello, tu klasa");
		new Zegar();
	}
}

Zegrar.java:

package jlib;
import java.util.Date;
public class Zegar{
	public Zegar(){
		System.out.println("Dzisiaj jest " + new Date());
	}
}

Teraz wchodzę do wiersza poleceń. Jeszcze dodam, że mam katalog bin Javy w zmiennej PATH i polecenia java, javac i jar działają. Nie mam zmiennej CLASSPATH, bo gdzieś przeczytałem, że można się bez tego obejść, a dodawać coś do niej warto, gdy chce się tej biblioteki używać częściej. Uznałem, że obejdę się na razie bez tego.

D:\>javac \jlib\Zegar.java
D:\>jar -cvf bibl.jar jlib\Zegar.class
added manifest
adding: jlib/Zegar.class(in = 606) (out= 371)(deflated 38%)

Mam w katalogu D: plik bibl.jar. Teraz chcę skompilować Klasa.java.

D:\>javac -cp bibl.jar Klasa.java
Wygląda na to że się zrobiło, nie dało żadnych błędów. Mam plik Klasa.class. No to teraz test.

D:\>java -cp bibl.jar Klasa
Error: Could not find or load main class Klasa

Jak nie może znaleźć czegoś co jest w tym katalogu???
W katalogu D: mam bibl.jar, Klasa.class, Klasa.java i katalog jlib, a w nim Zegar.class i Zegar.java.

Ale mogę skompilować i uruchomić, używając bibliotek Zegar.class

D:\>javac -cp jlib\* Klasa.java
D:\>java Klasa
Hello, tu klasa
Dzisiaj jest Mon May 05 18:06:54 CEST 2014

zamiana znaczników `` na <code> - furious programming

0

Bo jak dajesz -cp to musisz podać CAŁY classpath a nie tylko tego dodatkowego jara ;] Musisz też dodać do niego bieżący katalog jeśli z niego bierzesz jakieś klasy.

0

No to zrobiłem od nowa, dodając po średniku kropkę i pisząc całe ścieżki

D:\>javac D:\jlib\Zegar.java

D:\>jar -cf bibl.jar D:jlib\Zegar.class

D:\>javac -cp D:\bibl.jar;. D:\Klasa.java

D:\>java -cp D:\bibl.jar;. D:\Klasa
Error: Could not find or load main class D:\Klasa

I nic to nie dało. Dobrze rozumiem, że classpath jest potrzebny tylko dla klas niestandardowych, czyli zrobionych lub ściągniętych przez usera i nie dotyczy takiego java.util.Date? I klasa główna, czyli ta w której jest main(), nie musi być w tym path? Chyba nawet każda klasa, którą kompiluję, a która nie wymaga dodatkowych klas, albo te klasy są w katalogach odpowiadających pakietom (patrząc z katalogu z klasą kompilowaną) nie wymaga -cp?

Mam taką sytuację:

D:\jlib\Zegar.java
D:\Klasa.java

Żadnych innych .class, .jar czy .java. Classpath nie istnieje, polecenie echo %CLASSPATH% zwraca dosłownie słowo %CLASSPATH%. Nigdy nie użyłem set CLASSPATH = .
I gdy nie chcę używać .jar, to wystarczy, że zrobię
D:\>javac Klasa.java
żadnych -cp, samo znajduje Zegar.java i robi Zegar.class

D:\>java Klasa
Hello, tu klasa
Dzisiaj jest Tue May 06 11:15:42 CEST 2014

też żadnych -cp, żadnych ścieżek absolutnych.

0

Mam wrażenie że to nie dla ciebie. Odpalaj to sobie z jakiegoś IDE i zapomnij o konsoli ;]

  1. Classpath jest potrzebny do uruchamiania a nie do kompilacji
  2. Źle podajesz ścieżkę dlatego nie chce się odpalić. Powinieneś do classpath dodać ścieżkę do katalogu a potem tylko nazwę klasy którą chcesz uruchomić.
  3. Jak nie podasz -cp to ustawi się on na classpath z java_home
0
  1. To jak mam skompilować Klasa.java, która korzysta z bibl.jar bez -cp?
  2. Tu nie doszedłem, bo bez -cp nie skompilowało mi.
1

Ok, nie doczytałem co ty tu robisz do końca ;) Kompilacje z cp miałeś napisaną poprawnie, tylko uruchomienie nie. Nie możesz tak podac ścieżki.

0

Uff, udało się. Już chciałem pisać maila do Oracle'a, ale dzięki Tobie przetestowałem kilka poleceń uruchamiających.
Jakby ktoś miał podobny problem, to te dwa co wpisywałem poprzednio nie działają:

D:\>java -cp bibl.jar Klasa
D:\>java -cp D:\bibl.jar;. D:\Klasa

dodatkowo sprawdzone i nie działa
D:\>java -cp bibl.jar D:\Klasa
Działają takie

D:\>java -cp D:\bibl.jar;. Klasa
D:\>java -cp .;bibl.jar Klasa

Kropka może być przed albo po ścieżce. Ścieżka może być pełna albo nie.
Klasa uruchamiana nie może mieć żadnego D:\ ani nawet .\, przynajmniej w windowsie (! co mi to D: kazało dopisać?)

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