在我的代码中,我有以下语句import com.apple.dnssd.*;
和编译器(javac)抱怨此行。它写道包不存在。但我认为可能是“javac”在错误的地方(目录)搜索包。在这方面,我有两个问题:
我如何知道javac搜索包的位置?
我认为我很可能有上面提到的套餐,但我不知道它的位置。寻找包裹的典型地方是什么?
增加:
在另一台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文件(而不是目录)。
答案 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 )。
为了节省一次又一次重新输入相同内容的时间,只需创建一个bat
或cmd
文件(如果您使用的是* 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之类的内容。