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

2022-09-01 06:37:20

我是一个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等,但要么我完全搞砸了,要么错过了其他东西。

编辑 感谢您的建议 - 我以前尝试过类路径。这无济于事。

我尝试编译

javac -classpath <parent> client.java 

结果是:

package com.company does not exist

我有要导入的代码(两个java文件)在\com\company\product中。我编译这些很好。(它们包含 MyClass)我甚至为他们做了一个罐子文件。我将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 

在父目录中 - 并且工作正常。

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

编辑:

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

谢谢


答案 1

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

你应该有目录 ,包含目录 ,包含目录,包含文件。comcompanyexampleMyClass.java

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

$ javac com\company\example\MyClass.java

然后:

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

这两者都必须从源树的根目录完成。否则,将无法找到任何其他包(实际上,甚至无法运行)。javacjavajavaMyClass

一个简短的示例

我创建了文件夹“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

这是否使事情变得更加清晰?


答案 2

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

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

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

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

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

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