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

Posted

技术标签:

【中文标题】java中的包帮助 - 导入不起作用【英文标题】:Help with packages in java - import does not work 【发布时间】:2010-10-12 12:19:46 【问题描述】:

我是 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

我在 \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 

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

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

编辑:

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

谢谢

【问题讨论】:

向我们展示您的文件(.java,更重要的是 .class)的确切布局以及您将类路径设置为的内容。然后向我们展示来自编译器的确切错误消息。否则,我们只能将您引导至通用资源/教程。 我已经给出了确切的错误信息。不幸的是,我无法发布我公司的代码。我提供的通用信息是完整的,只是用我的公司名称替换​​了“公司” 我猜这是一个类路径问题 - 但没有任何建议可以解决问题。 javac -classpath &lt;parent&gt; client.java中的&lt;parent&gt;应该是指com上面的目录。如果你在com,那就是../ 【参考方案1】:

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

所以,当你这样做时:

javac -classpath <parent> client.java

&lt;parent&gt; 应该是指com 的父级。如果你在com,那就是../

【讨论】:

是的。 com 目录的parent 目录。他可能正在使用com 目录并将其称为&lt;parent&gt;。但说明是指com 目录本身的父级。【参考方案2】:

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

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

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

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

Google 搜索“Java 类路径”。它会找到像this 这样的链接。

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

【讨论】:

【参考方案3】:

你得到了一堆很好的答案,所以我只是提出一个建议。如果您打算在这个项目上工作超过 2 天,请下载 eclipse 或 netbeans 并在其中构建您的项目。

如果你通常不是java程序员,那么它给你的帮助将是无价的。

如果您只花 2 小时下载/安装,那 1/2 小时的下载/安装是不值得的。

两者都有“修复导入”的热键/菜单项,这样您就不必再担心导入了。

【讨论】:

【参考方案4】:

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

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

也就是说,它将在具有“修改名称”的包的子目录中查找,其中“.”替换为文件分隔符。

另外,值得注意的是,您不能嵌套 .jar 文件。

【讨论】:

【参考方案5】:

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

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

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

$ javac com\company\example\MyClass.java

然后:

$ java com.company.example.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 测试包\*.java C:\examples>javac testpackage2\*.java

然后:

C:\examples>java testpackage.TestPackageClass 您好,来自 testpackage.TestPackageClass! 现在访问 testpackage2.MyClass

这会让事情变得更清楚吗?

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于java中的包帮助 - 导入不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Shadow 重定位的包中的 Kotlin 属性不起作用

将Java小程序项目导入netbeans不起作用,Netbeans即使手动设置也拒绝识别甚至找不到主类

python中的绝对导入不起作用,相对导入起作用

Spark Scala 程序中的隐含功能不起作用

cpanel中的Phpmyadmin导入数据库不起作用

带有数值的 SSIS 查找不起作用