Toon posts:

[java] kan jar file niet runnen.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Help!

Ik snap er niks van...

Ik heb een klasse in een package gestopt op de volgende wijze:
code:
1
2
3
4
5
package net.tweakers.util;

public abstract class Simple {
    public abstract void simple();
}

Deze klasse heb ik gewoon gecompiled en aan een jar-file toegevoegd op de volgende wijze:
code:
1
2
3
4
javac Simple.java #levert Simple.class op
mkdir -p net/tweakers/util
mv Simple.class net/tweakers/util/
jar cvf simple.jar net

Deze jar-file heb ik toegevoegd aan mijn library-directory. En de jar-file toegevoegd aan mijn CLASSPATH variabele.

Mijn CLASSPATH ziet er nu zo uit:
code:
1
2
[harm@aphrodite tweakers]$ echo $CLASSPATH
/home/harm/javalibs/simple.jar:.

Vervolgens maak ik nog een klasse:
code:
1
2
3
4
5
6
7
8
9
10
11
package net.tweakers;
import net.tweakers.util.*;

public class Tweakers extends Simple {
    public void simple() {
      System.out.println("Simple!");
    }
    public static void main(String args[]) {
      new Tweakers().simple();
    }
}

Ook die compile ik en maak ik een jar file:
code:
1
2
3
4
javac Tweakers.java
mkdir -p net/tweakers
mv Tweakers.class net/tweakers
jar cmf MANIFEST.MF tweakers.jar net

In mijn MANIFEST.MF staat overigens:
code:
1
2
3
Manifest-Version: 1.0
Created-By: 1.4.0 (Sun Microsystems Inc.)
Main-Class: net.tweakers.Tweakers

Nu wil ik de tweakers.jar runnen met:
code:
1
java -jar -classpath $CLASSPATH tweakers.jar

Ik krijg dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[harm@aphrodite bras]$ java -jar -cp $CLASSPATH tweakers.jar
Exception in thread "main" java.lang.NoClassDefFoundError: net/tweakers/util/Simple
      at java.lang.ClassLoader.defineClass0(Native Method)
      at java.lang.ClassLoader.defineClass(ClassLoader.java:509)
      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
      at java.net.URLClassLoader.defineClass(URLClassLoader.java:246)
      at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
      at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
      at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)

Echter als ik als volgt run:
code:
1
2
[harm@aphrodite bras]$ java -classpath tweakers.jar:$CLASSPATH net.tweakers.Tweakers
Simple!

Dat werkt dus wel! Iemand enig idee hoe dit kan en hoe ik dit zou kunnen oplossen?

Bedankt!

Verwijderd

Euh, de tweakers.jar direkt achter de -jar zetten? Ook als dat niet hoeft vind ik dat duidelijker.

En verder geeft ie dus aan dat ie
net/tweakers/util/Simple

Niet kan vinden.

Verwijderd

Topicstarter
Op donderdag 18 juli 2002 17:40 schreef Bunny het volgende:
Euh, de tweakers.jar direkt achter de -jar zetten? Ook als dat niet hoeft vind ik dat duidelijker.

En verder geeft ie dus aan dat ie
net/tweakers/util/Simple

Niet kan vinden.
Sorry mijn fout! Dat had er inderdaad moeten staan. Maar dat lost het probleem niet op!

Het moet dus zijn:
code:
1
java -classpath $CLASSPATH -jar tweakers.jar

Dat hij die Simple niet kan vinden is dus ook het probleem! Maar zoals je kunt zien in mijn eerste posting blijkt dat deze wel degelijk in het classpath staat. Er is dus geen reden dat hij het niet kan vinden....

Verwijderd

Check ff of je Simple.class wel op de juiste manier in je JAR staat; jar -tvf etc. Staat er wel net/tweakers.etc ?

Want anders vind ie hem misschien in je classpath omdat je nog . daarbij hebt, maar als ie hem uit de JAR moet halen kan ie hem daar niet vinden...

Verwijderd

PS als je javac -d . gebruikt, kopieert ie de gecompileerde class zelf naar de juiste directory (die maakt ie ook aan als ie er niet is); scheelt je een hoop gedoe met md en mv etc!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
[harm@aphrodite javalibs]$ jar -tvf simple.jar 
     0 Thu Jul 18 16:06:54 CEST 2002 META-INF/
    68 Thu Jul 18 16:06:54 CEST 2002 META-INF/MANIFEST.MF
     0 Thu Jul 18 15:59:18 CEST 2002 net/
     0 Thu Jul 18 16:06:36 CEST 2002 net/tweakers/
     0 Thu Jul 18 16:06:46 CEST 2002 net/tweakers/util/
   221 Thu Jul 18 16:06:04 CEST 2002 net/tweakers/util/Simple.class

Lijkt mij gewoon in orde...
Volgens mij is hier iets vreemds aan de hand....

Verwijderd

Hoezo, in orde? Ik zie je Tweakers.class helemaal niet in de jar staan...
Als je in aparte stappen files aan je jar-file wilt toevoegen, moet je alleen de eerste keer optie 'c' van create gebruiken, en daarna 'u' van update.

Verwijderd

Topicstarter
Op zondag 21 juli 2002 00:12 schreef Bunny het volgende:
Hoezo, in orde? Ik zie je Tweakers.class helemaal niet in de jar staan...
Als je in aparte stappen files aan je jar-file wilt toevoegen, moet je alleen de eerste keer optie 'c' van create gebruiken, en daarna 'u' van update.
eH.... Nu ben ik je even kwijt...
Ik run dus:
code:
1
java -jar -cp $CLASSPATH tweakers.jar

Dan zeurt hij:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[harm@aphrodite bras]$ java -jar -cp $CLASSPATH tweakers.jar
Exception in thread "main" java.lang.NoClassDefFoundError: net/tweakers/util/Simple
      at java.lang.ClassLoader.defineClass0(Native Method)
      at java.lang.ClassLoader.defineClass(ClassLoader.java:509)
      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
      at java.net.URLClassLoader.defineClass(URLClassLoader.java:246)
      at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
      at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
      at java.security.AccessController.doPrivileged(Native Method)
      at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
      at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)

Hij mist dus Communicator. Die zit dus wel in simple.jar. En op de juiste manier...

Mis ik hier nu iets???

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens je manifest is de mainclass de Tweakers...

Die zit toch echt niet in je .jar

Verwijderd

Topicstarter
Op maandag 22 juli 2002 11:50 schreef ACM het volgende:
Volgens je manifest is de mainclass de Tweakers...

Die zit toch echt niet in je .jar
Jawel hoor... Die zit in: tweakers.jar

Ik importeer echter de klasse Simple van simple.jar.

Dus, ff voor de goede orde:

simple.jar
code:
1
2
3
4
5
6
7
[harm@aphrodite javalibs]$ jar -tvf simple.jar 
     0 Thu Jul 18 16:06:54 CEST 2002 META-INF/
    68 Thu Jul 18 16:06:54 CEST 2002 META-INF/MANIFEST.MF
     0 Thu Jul 18 15:59:18 CEST 2002 net/
     0 Thu Jul 18 16:06:36 CEST 2002 net/tweakers/
     0 Thu Jul 18 16:06:46 CEST 2002 net/tweakers/util/
   221 Thu Jul 18 16:06:04 CEST 2002 net/tweakers/util/Simple.cl

tweakers.jar
code:
1
2
3
4
5
6
[harm@aphrodite tweakers]$ jar tvf tweakers.jar
     0 Thu Jul 18 16:14:14 CEST 2002 META-INF/
    68 Thu Jul 18 16:14:14 CEST 2002 META-INF/MANIFEST.MF
     0 Thu Jul 18 16:08:34 CEST 2002 net/
     0 Thu Jul 18 16:08:44 CEST 2002 net/tweakers/
   515 Thu Jul 18 16:07:42 CEST 2002 net/tweakers/Tweakers.class

En de code van MANIFEST.MF van tweakers.jar:
code:
1
2
3
4
[harm@aphrodite META-INF]$ cat MANIFEST.MF
Manifest-Version: 1.0
Main-Class: net.tweakers.Tweakers
Created-By: 1.4.0 (Sun Microsystems Inc.)

Ik run dus:
code:
1
java -jar -cp $CLASSPATH tweakers.jar

tweakers.jar heeft dus code nodig uit simple.jar (Simple). Die importeert hij ook. Het is juist dat wat mis gaat. Hij kan de klasse Simple niet vinden. Terwijl simple.jar toch echt in mijn CLASSPATH staat.

Help...???? Ik snap er echt niets meer van....

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat is de precieze waarde van de classpath? Staat daar de dir naar de simple.jar of de simple.jar zelf in?

Verwijderd

Topicstarter
Op maandag 22 juli 2002 13:21 schreef ACM het volgende:
Wat is de precieze waarde van de classpath? Staat daar de dir naar de simple.jar of de simple.jar zelf in?
code:
1
2
[harm@aphrodite META-INF]$ echo $CLASSPATH
/home/harm/javalibs/simple.jar:.

Daar staat dus simple.jar zelf in...
Pagina: 1