我怎样才能找到包裹?

时间:2010-03-08 10:43:30

标签: java directory classpath packages

在我的代码中,我有以下语句import com.apple.dnssd.*;和编译器(javac)抱怨此行。它写道包不存在。但我认为可能是“javac”在错误的地方(目录)搜索包。在这方面,我有两个问题:

  1. 我如何知道javac搜索包的位置?

  2. 我认为我很可能有上面提到的套餐,但我不知道它的位置。寻找包裹的典型地方是什么?

  3. 增加:

    在另一台Windows机器上,我尝试了同样的事情而且“javac”没有抱怨(就像之前我编译时没有任何选项,如“-cp”)。我检查“classpath”环境变量的值。它等于“C:\ Program Files \ Java \ jdk1.6.0_18 \ bin;。; ..”。我去了第一个类路径目录,但没有找到可能是“com.apple.dnssd”库的东西(没有jar文件,没有包含“apple”的文件)。所以,我不明白为什么javac不会在第二台Windows机器上抱怨。

    已添加2:

    在机器#2上,我在JDK之后安装了Bonjour。在机器#1上,JDK是在Bonjour之后安装的。

    已添加3:

    在机器#1(我无法导入包)上,我找到了jar文件(它位于“C:\ Program Files \ Bonjour”中,其名称为“dns_sd.jar”)。我试图将上述目录添加到Windows 7上的PATHCLASS环境变量中(我重新启动了系统)。它没有帮助。我仍然无法导入包。我还尝试在命令行中指定“-classpath”。它也没有帮助。现在我将尝试重新安装Bonjour(按照建议)。

    已添加4:

    我已经卸载了Bonjour和Bonjour SDK。我重装了Window。然后我安装了Bonjour和Bonjour SDK。我重装了Window。它没有解决问题。我仍然无法导入包(javac写道包不存在)。我还将* .jar文件复制到源所在的同一目录。这是行不通的。我用了“javac -cp。”。这是行不通的。现在我没有选择。我不知道还能尝试什么。有人可以帮我请求吗?

    已添加5:


    我的类路径是:C:\ Program Files \ Java \ jdk1.6.0_18 \ bin;。; ..;“C:\ Program Files \ Bonjour”
    我尝试从这个目录编译:C:\ Users \ myname \ java \ bonjour \ example
    我通过以下命令编译:javac ServiceAnnouncer.java
    我收到以下错误消息:ServiceAnnouncer.java:1:package com.apple.dnssd不存在

    已添加6:

    最后我设法导入了库。我是按照以下方式做到的:

    javac -cp "C:\Program Files\Bonjour\dns_sd.jar" ServiceAnnouncer.java
    

    重要的是我在-cp之后指定了jar文件(而不是jar文件所在的目录)。如果我用“*”替换“dns_sd.jar”也可以。所以,我的结论是在“-cp”之后我需要指定jar文件(而不是目录)。

4 个答案:

答案 0 :(得分:4)

Java / javac将在类路径中搜索类。

默认类路径涵盖/path/to/jre/lib/path/to/jre/lib/ext个文件夹。在那里找到的任何类和JAR文件都将在类路径中获取。您可以理论将您的类和JAR文件放在那里,这样您就不需要做任何事情来让java / javac找到它们。但这实际上是一种非常糟糕的做法。它是可移植性问题的秘诀,因为这在所有机器中都不一样。保留这些文件夹。

然后是环境变量%CLASSPATH%,您可以在其中指定类所在的根文件夹的完整路径和/或JAR文件的完整路径(包括JAR文件名本身!)。 Windows中的多个路径由分号;分隔,而* Nix由冒号:分隔。内部空格的路径需要引用""。这是一个例子:

SET CLASSPATH = .;/path/to/File.jar;"/spacy path to some pkg/with/classes"

请注意参数开头的句点.。这表示当前路径(执行java / javac命令的当前工作目录)。它只会在当前路径中找到 classes ,因而不是JAR文件!您需要为它们指定完整路径。从Java 1.6开始,您还可以使用通配符在某个路径中指定多个JAR文件。 E.g。

SET CLASSPATH = .;/path/to/all/jars/*;"/spacy path to some pkg/with/classes"

这个环境变量实际上是一种管理类路径的便捷方式,因此您不需要每次在命令控制台中反复键入相同的内容。但这只对新手到java用户以及将来混淆的原因有用,因为他们会认为这是“the”类路径。这个假设实际上是错误,并且再次导致可移植性问题,因为这在所有机器中都不相同。

定义类路径的正确方法是使用-cp-classpath参数,其中您实际指定的信息与您要为%CLASSPATH%输入的信息相同,即(半)冒号分隔并引用带有空格的路径,例如:

javac -cp .;/path/to/File.jar;"/spacy path to some pkg/with/classes" Foo.java

请注意,当您使用-cp-classpath(或-jar)个参数时,java / javac将忽略 %CLASSPATH%环境变量(实际上是Good Thing TM )。

为了节省一次又一次重新输入相同内容的时间,只需创建一个batcmd文件(如果您使用的是* Nix,则为sh文件)。基本上只需在控制台中输入“plain”,然后以通常的平台特定方式执行它。

要节省更多时间,请使用IDE。在IDE内的编译时和运行时期间使用的类路径称为“构建路径”。探索项目属性,你会看到。

答案 1 :(得分:2)

http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

回答你的第一个问题(如何知道javac搜索包的位置):

检查$ CLASSPATH变量的设置。

echo $CLASSPATH

这是JRE搜索类文件和资源的地方。您可以将其设置为环境变量

set CLASSPATH=path1;path2  ... 

或在运行javac时设置它。

C:> javac -classpath C:\java\MyClasses src_dir

(找到javac的好例子here

在这种情况下,包含'com.apple.dnssd。*'的jar文件应该位于类路径中。只需下载该jar,并将其放在您的类路径搜索的位置。

答案 2 :(得分:1)

假设dns_sd.jar安装在'C:\ Program Files \ Bonjour'中,那么尝试编译你的代码:

cd C:\Users\myname\java\bonjour\example
javac -classpath C:\Program Files\Bonjour ServiceAnnouncer.java

答案 3 :(得分:0)

此链接表明包含此包的JAR是Bonjour for Windows的一部分。在那里寻找它。

javac.exe仅搜索您使用CLASSPATH告诉它的位置。如果您不了解如何设置CLASSPATH,我建议您阅读this之类的内容。