帮助java中的包 - 导入不起作用

时间:2009-03-10 18:36:51

标签: java import packages

我是一名C ++开发人员 - 不是java开发人员,但必须使这段代码正常工作......

我有2个公共类,将被另一个产品使用。我在每个java文件中使用了package指令。

package com.company.thing;

class MyClass ...

当我尝试编译使用它的测试应用时,我添加

import com.company.thing.*;

javac编译器因com.company不存在而失败。 (即使我将它编译在与我刚制作包的类文件相同的目录中)

我确信我正在做一些愚蠢和愚蠢的事情。

我已经阅读了http://java.sun.com/docs/books/tutorial/java/package/usepkgs.html页面,并尝试设置一个像/ com / company / thing等目录结构,但要么我完全把它搞砸了,要么错过了其他的东西。

EDIT 感谢您的建议 - 之前我曾尝试过类路径。它没有帮助。

我尝试编译

javac -classpath <parent> client.java 

结果是:

package com.company does not exist

我在\ com \ company \ product中有我要导入的代码(两个java文件)。我编译好了。 (它们包含MyClass)我甚至为它们制作了一个jar文件。我将jar文件复制到父目录。

然后我(在父目录中使用客户端java文件)

javac -cp <jarfile> *.java

结果是:

cannot access MyClass
bad class file: MyClass.class(:MyClass.class)
class file contains wrong class: com.company.product.MyClass
Please remove or make sure it appears in the correct subdirectory of the classpath.

修改

如果我使用MyClass的完全限定名称并在父目录中编译它,我获得了编译和运行的客户端代码。我现在完全糊涂了。

编译没有设置类路径 - 只是

javac *.java 

在父目录中 - 它工作正常。

我可以获得一个测试应用程序来编译,但是当我必须将它集成到生产代码中时,这不会削减它。仍在寻求帮助。

编辑:

最后 - 不确定之前为什么它不起作用 - 但我清理了整个目录结构中的所有文件,现在它可以工作了。

由于

6 个答案:

答案 0 :(得分:46)

好的,只是为了澄清已发布的内容。

您应该拥有包含目录com的目录company,其中包含目录example,其中包含文件MyClass.java

从包含com的文件夹中,运行:

$ javac com\company\example\MyClass.java

然后:

$ java com.company.example.MyClass
Hello from MyClass!

这些必须都是从源树的根目录完成的。否则,javacjava将无法找到任何其他包(事实上,java甚至无法运行MyClass)。

一个简短的例子

我创建了文件夹“testpackage”和“testpackage2”。在testpackage中,我创建了包含以下代码的TestPackageClass.java:

package testpackage;

import testpackage2.MyClass;

public class TestPackageClass {
    public static void main(String[] args) {
        System.out.println("Hello from testpackage.TestPackageClass!");
        System.out.println("Now accessing " + MyClass.NAME);
    }
}

在testpackage2中,我创建了包含以下代码的MyClass.java:

package testpackage2;
public class MyClass {
    public static String NAME = "testpackage2.MyClass";
}

从包含两个新文件夹的目录中,我跑了:

C:\examples>javac testpackage\*.java

C:\examples>javac testpackage2\*.java

然后:

C:\examples>java testpackage.TestPackageClass
Hello from testpackage.TestPackageClass!
Now accessing testpackage2.MyClass

这会让事情更清楚吗?

答案 1 :(得分:10)

是的,这是一个类路径问题。您需要告诉编译器和运行时您的.class文件所在的目录是CLASSPATH的一部分。您需要添加的目录是包结构开头的“com”目录的父目录。

您可以使用javac.exe和java.exe的-classpath参数执行此操作。

还应该询问您正在使用的第三方课程是如何打包的。如果他们在JAR中,并且我建议您将它们放在一个JAR中,则将.jar文件添加到类路径中:

java -classpath .;company.jar foo.bar.baz.YourClass

Google for“Java classpath”。它会找到像this这样的链接。

还有一件事:“import”不加载类。所有这一切都可以节省您的打字。当您包含import语句时,您不必在代码中使用完全解析的类名 - 您可以键入“Foo”而不是“com.company.thing.Foo”。这就是它所做的一切。

答案 2 :(得分:5)

听起来你的目录结构正确。编译依赖代码时,请指定-classpath javac参数。使用com目录的目录,其中com依次包含company/thing/YourClass.class

答案 3 :(得分:5)

你有很多好的答案,所以我会抛出一个建议。如果您要在这个项目上工作超过2天,请下载eclipse或netbeans并在那里构建您的项目。

如果您通常不是Java程序员,那么它将为您提供的帮助将非常宝贵。

如果你只花了2个小时就不值得半小时下载/安装。

两者都有“修复导入”的热键/菜单项,这样你再也不用担心导入。

答案 4 :(得分:3)

标准的Java类加载器是目录结构的坚持者。类路径中的每个条目都是一个目录或jar文件(或者真正的zip文件),然后它会搜索给定的类文件。例如,如果您的类路径是“。; my.jar”,它将在以下位置搜索com.example.Foo:

./com/example/
my.jar:/com/example/

也就是说,它会查看包含'modified name'的子目录,其中'。'被文件分隔符替换。

此外,值得注意的是,您无法嵌套.jar文件。

答案 5 :(得分:0)

只需在系统变量和用户变量菜单下添加类路径条目(我的意思是您的父目录位置)... 关注:右键单击我的电脑&gt;属性&gt;高级&gt;环境变量