理解Java中的JAR和包
我试图理解JAR和包在Java中是如何工作的。为此,我创建了一个简单的测试JAR,并尝试使用该JAR中包含的类。很简单,但它会给我一些错误,比如“找不到类”。以下是设置: 1) 我有一个名为MyHelloWorld.java的文件,它将打包在一个JAR中:理解Java中的JAR和包,java,jar,packages,Java,Jar,Packages,我试图理解JAR和包在Java中是如何工作的。为此,我创建了一个简单的测试JAR,并尝试使用该JAR中包含的类。很简单,但它会给我一些错误,比如“找不到类”。以下是设置: 1) 我有一个名为MyHelloWorld.java的文件,它将打包在一个JAR中: package com.mytest; public class MyHelloWorld { public String getHello() { return "Hello"; } public
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) 我使用javacmyhelloworld.java
5) 我从根文件夹运行jar-cf myhello.jar./com/mytest/*.class
来创建jar文件(如中所述)
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中定义包名等方面的见解,我们将不胜感激 我相信它正在罐子里寻找你的HelloHello类。您可能也需要类路径上的当前文件夹
java -cp .:myhello.jar HelloHello
我相信它正在罐子里寻找你的HelloHello课程。您可能也需要类路径上的当前文件夹
java -cp .:myhello.jar HelloHello
确保HelloHello.class位于适当的目录结构(com/mytest)中,然后更改第8步:
8) java com.mytest.HelloHello //or java -cp .;*.jar com.mytest.HelloHello
确保HelloHello.class位于适当的目录结构(com/mytest)中,然后更改第8步:
8) java com.mytest.HelloHello //or java -cp .;*.jar com.mytest.HelloHello
好吧,
java HelloHello
也可以好吧,java HelloHello
也可以你应该使用:
java -cp .:./* HelloHello
java
和javac
对待-cp参数有点不同。使用java
时,cp中的*
将自动加载在给定位置找到的所有jar
此外,冒号:
是不同类路径元素之间的分隔符。您应该使用:
java -cp .:./* HelloHello
java
和javac
对待-cp参数有点不同。使用java
时,cp中的*
将自动加载在给定位置找到的所有jar
另外,冒号
:
是不同类路径元素之间的分隔符。谢谢,分号应该是冒号吗?我在Unix。使用分号运行会显示用法消息。我尝试了java-cp.*.jar HelloHello
,但现在由于线程“main”java.lang.NoClassDefFoundError中的异常而失败:com/mytest/MyHelloWorld位于HelloHello.main(HelloHello.java:5),原因是:java.lang.ClassNotFoundException:com.mytest.MyHelloWorld位于java.net.URLClassLoader$1.run(URLClassLoader.java:200)…etc
可以尝试使用分号,但引用它是为了保护它不受shell的影响<代码>java-cp'。;myhello.jar'HelloHello刚刚尝试过,但在java-cp.*.jar HelloHello
上没有任何成功。必须实际命名jarjava-cp.:myhello.jar HelloHello
谢谢,分号应该是冒号吗?我在Unix。使用分号运行会显示用法消息。我尝试了java-cp.*.jar HelloHello
,但现在由于线程“main”java.lang.NoClassDefFoundError中的异常而失败:com/mytest/MyHelloWorld位于HelloHello.main(HelloHello.java:5),原因是:java.lang.ClassNotFoundException:com.mytest.MyHelloWorld位于java.net.URLClassLoader$1.run(URLClassLoader.java:200)…etc
可以尝试使用分号,但引用它是为了保护它不受shell的影响<代码>java-cp'。;myhello.jar'HelloHello刚刚尝试过,但在java-cp.*.jar HelloHello
上没有任何成功。必须实际命名jarjava-cp.:myhello.jar HelloHello
所以现在,HelloHello只是导入com.mytest包,MyHelloWorld是其中的一个类。HelloHello不是这个包裹的一部分。我觉得它不应该是包的一部分,因为在大多数情况下,您将使用JAR来定义自己的包。我理解正确吗?哦,对不起,我以为是包com.mytest:)Java包将类组织成模块,强烈建议将所有类放入包中。所以现在,HelloHello正在导入com.mytest包,MyHelloWorld就是其中的一个类。HelloHello不是这个包裹的一部分。我觉得它不应该是包的一部分,因为在大多数情况下,您将使用JAR来定义自己的包。我理解得对吗?哦,对不起,我以为是包com.mytest:)Java包将类组织成模块,强烈建议将所有类放入PackagesHanks中,*是我正在寻找的解决方案-比单独添加所有JAR更干净!谢谢,*是我一直在寻找的解决方案-比单独添加所有罐子更干净!有没有一个使用IDE的选项,这样你就不必处理所有这些问题?这更符合我的理解,但不,不是真的打算使用IDE…有没有一个使用IDE的选项,这样你就不必处理所有这些问题?这更符合我的理解,但不,不是真的打算使用IDE。。。