【问题标题】:How can I find a package?如何找到包裹?
【发布时间】:2011-01-24 22:25:37
【问题描述】:

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

  1. 我如何知道 javac 在哪里搜索包?

  2. 我认为我很可能有上述包裹,但我不知道它在哪里。寻找包裹的典型地点是什么?

添加:

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

添加 2:

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

添加 3:

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

添加 4:

我已卸载 Bonjour 和 Bonjour SDK。我已经重新加载窗口。然后我安装了 Bonjour 和 Bonjour SDK。我已经重新加载了窗口。它没有解决问题。我仍然无法导入包(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: com.apple.dnssd 包不存在

添加 6 个:

我终于成功地导入了库。我是通过以下方式做到的:

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

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

【问题讨论】:

  • 你应该在这个问题中添加标签“classpath”(我还没有权限)
  • 您是否阅读了 duffymo 发布的链接?也许在 2 号机器上,Windows 的 Bonjour 是在 JDK 之后安装的。您正在寻找一个文件:dns_sd.jar
  • @timmyd,你是对的。在 2 号机器上,Bonjour 是在 JDK 之后安装的(在 1 号机器上,JDK 是在 Bonjour 之后安装的)。我阅读了 duffymo 的回答,但我仍然不明白该库在 2 号机器上的位置以及如何在 1 号机器上找到和使用库。
  • 我阅读的说明说您应该再次安装 Bonjour(在安装 JDK 之后)。在 #1 机器上试试这个
  • 你能准确地展示你的类路径是什么吗?以及您正在执行的命令(以及从哪个目录执行)。以及您收到的确切错误消息。

标签: java directory classpath packages


【解决方案1】:

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】:

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

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

    【讨论】:

      【解决方案3】:

      Java/javac 将在 classpath 中搜索类。

      default 类路径涵盖/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 文件。例如

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

      这个环境变量实际上是一种管理类路径的便捷方式,这样您就不需要每次在命令控制台中一遍又一遍地键入相同的内容。但这仅对 Java 新手有用,并且会导致所有未来的混乱,因为他们会认为这是 "the" 类路径。这个假设实际上是错误的,这又是导致可移植性问题的原因,因为并非所有机器都相同。

      定义类路径的正确方法是使用-cp-classpath 参数,其中您实际上为%CLASSPATH% 指定了相同的信息,即(半)冒号分隔和paths-with -空格引用,例如:

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

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

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

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

      【讨论】:

      • “请注意参数开头的句点 .。这表示当前路径。” - 我认为您的意思是“当前 目录 ” .如果您说“当前路径”,则可以解释为“当前类路径”。
      • 确实如此。路径 != 类路径。
      • @Mark:已修复,非常感谢。
      【解决方案4】:

      假设 dns_sd.jar 安装在 'C:\Program Files\Bonjour' 中,然后尝试像这样编译您的代码:

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

      【讨论】:

      • 嗯,我试过了,但没有用。当我输入文件名时它开始工作”:javac -cp "C:\Program Files\Bonjour\dns_sd.jar" ServiceAnnouncer.java
      猜你喜欢
      • 2017-07-18
      • 2018-03-30
      • 2020-05-31
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2021-11-25
      • 2011-03-03
      • 1970-01-01
      相关资源
      最近更新 更多