了解Java中的JAR和包

时间:2011-03-16 00:30:23

标签: java jar packages

我正在尝试了解jar和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)我使用javac MyHelloWorld.java

在该文件夹中编译了MyHelloWorld.java

5)我从根文件夹运行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 [FAILS](我也尝试过`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等中定义包名称也将不胜感激!

4 个答案:

答案 0 :(得分:5)

我相信它正在查找你的HelloHello类的jar。您可能也需要类路径上的当前文件夹。

java -cp .:myhello.jar HelloHello

答案 1 :(得分:1)

您应该使用:

java -cp .:./* HelloHello

javajavac对待-cp参数有点不同。使用java cp中的*会自动加载它在给定位置找到的所有jar。

此外,冒号:是不同类路径元素之间的分隔符。

答案 2 :(得分:0)

确保HelloHello.class位于适当的目录结构(com / mytest)中,而不是更改第8步:

8) java com.mytest.HelloHello //or java -cp .;*.jar com.mytest.HelloHello

答案 3 :(得分:0)

好吧,java HelloHello也适用