我是一名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 -classpathclient.java
结果是:
package com.company does not exist
我在\ com\company\product中有我要导入的代码(两个java文件).我编译好了.(它们包含MyClass)我甚至为它们制作了一个jar文件.我将jar文件复制到父目录.
然后我做了(在客户端java文件的父目录中)
javac -cp*.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
在父目录中 - 它工作正常.
我可以得到一个测试应用程序来编译,但是当我必须将它集成到生产代码中时,这不会削减它.仍在寻求帮助.
编辑:
最后 - 不知道为什么它之前没有用 - 但我清理了整个目录结构中的所有文件,现在它可以工作了.
谢谢
好的,只是为了澄清已发布的内容.
您应该拥有com
包含该目录的目录company
,该目录example
包含该文件的目录MyClass.java
.
从包含的文件夹中com
,运行:
$ javac com\company\example\MyClass.java
然后:
$ java com.company.example.MyClass Hello from MyClass!
这些必须都是从源树的根目录完成的.否则,javac
而且java
将无法找到任何其他包(事实上,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
这会让事情更清楚吗?
是的,这是一个类路径问题.您需要告诉编译器和运行时您的.class文件所在的目录是CLASSPATH的一部分.您需要添加的目录是包结构开头的"com"目录的父目录.
您可以使用javac.exe和java.exe的-classpath参数执行此操作.
还应该询问您正在使用的第三方课程是如何打包的.如果它们在JAR中,并且我建议您将它们放在一个JAR中,则将.jar文件添加到类路径中:
java -classpath .;company.jar foo.bar.baz.YourClass
Google为"Java classpath".它会找到喜欢的链接此.
还有一件事:"import"不是加载类.所有这一切都可以节省您的打字.当您包含import语句时,您不必在代码中使用完全解析的类名 - 您可以键入"Foo"而不是"com.company.thing.Foo".这就是它所做的一切.
听起来你的目录结构正确.编译依赖代码时,请指定-classpath
参数javac
.使用目录的父目录com
,其中com
包含company/thing/YourClass.class
你有很多好的答案,所以我只是抛出一个建议.如果您要在这个项目上工作超过2天,请下载eclipse或netbeans并在那里构建您的项目.
如果您通常不是Java程序员,那么它将为您提供的帮助将是非常宝贵的.
如果你只花了2个小时就不值得半小时下载/安装.
两者都有"修复导入"的热键/菜单项,这样您就不必再担心导入了.