我试图了解Java中的jar和包如何工作。为此,我创建了一个简单的测试JAR,并尝试使用该jar中包含的类。很简单,但是它给了我类似“找不到类”的错误。设置如下:
1)我有一个名为MyHelloWorld.java的文件,该文件将打包在JAR中:
package com.mytest;
public class MyHelloWorld {
public String getHello() {
return "Hello";
}
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
2)我还有一个名为“ HelloHello.java”的文件,该文件在com.mytest.MyHelloWorld中使用函数
getHello()
import com.mytest.*;
public class HelloHello {
public static void main (String[] args) {
MyHelloWorld hello = new MyHelloWorld();
System.out.println(hello.getHello());
}
}
3)要将MyHelloWorld类打包到一个JAR中,我在当前目录中创建了
com/mytest
文件夹,并将MyHelloWorld.java移至该文件夹4)我使用
javac MyHelloWorld.java
在该文件夹中编译了MyHelloWorld.java5)我从根文件夹中运行
jar -cf myhello.jar ./com/mytest/*.class
以创建JAR文件(如http://www.javacoffeebreak.com/faq/faq0028.html中所述)6)我将HelloHello.java和myhello.jar复制到一个没有其他内容的新文件夹中,以测试此设置
7)
javac -cp ./*.jar HelloHello.java
[成功]8)
java -cp ./*.jar HelloHello
[失败](我也尝试了`java HelloWorld',它也失败了,并带有不同的错误消息)最后一条语句失败,并显示以下消息:
$java -cp ./*.jar HelloHello
Exception in thread "main" java.lang.NoClassDefFoundError: HelloHello
Caused by: java.lang.ClassNotFoundException: HelloHello
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:315)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398)
知道为什么它会失败吗?您可以提供任何有关为何以这种方式工作的见解,以及如何在JAR等内部定义包名称的任何见解!
最佳答案
您应该使用:
java -cp .:./* HelloHello
java
和javac
对-cp参数的处理略有不同。使用java
时,cp中的*
将自动加载在给定位置找到的所有jar。同样,冒号
:
是不同类路径元素之间的分隔符。