理解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

我试图理解JAR和包在Java中是如何工作的。为此,我创建了一个简单的测试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) 我使用
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
上没有任何成功。必须实际命名jar
java-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
上没有任何成功。必须实际命名jar
java-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。。。