【问题标题】:How do I import JARs and Packages in Java如何在 Java 中导入 JAR 和包
【发布时间】:2011-04-09 17:03:47
【问题描述】:

我对 Java 比较陌生。我一直在使用 Eclipse 做一些工作,但我想回到基础,只需将文本编辑器与 JDK 结合使用。我现在遇到的问题是 Eclipse 和其他 IDE 隐藏了许多对了解和完全理解非常重要的基本内容。这就是我想要做的:

  • 我创建了一个名为“C:\Java Projects”的目录,在该目录下创建了 3 个子文件夹,Project1、Project2 和 SharedJars。 Project1 和 Project2 都具有类和源等子目录。 Poject1 源 .java 文件位于“c:\Java Projects\Project1\source\com\myApp”中

  • Project1 和 Project2 都是使用位于 SharedJars 文件夹中的 Log4J JAR 的包。在 Eclipse 世界中,我可以设置一些东西来告诉 Eclipse 我的项目将使用哪些 JAR,然后执行类似 import org.apache.log4j.Logger 之类的操作,效果很好。但我正在努力让它发挥作用。

  • 我已将 CLASSPATH 环境变量设置为 "C:\Java Projects\SharedJars\log4j-1.2.15.jar"

  • 然后我执行以下操作:

    cd Project1\source
    javac -d ..\classes com\myApp\*

  • 这会产生一大堆相关错误,例如

拿起 _JAVA_OPTIONS: -Duser.home="C:\Java Projects"
com\myApp\Monitor.java:11:找不到符号
符号:类记录器
位置:com.myApp.Monitor 类
私有静态 Logger LOG;

一些问题: 1) 我还需要导入 org.apache.log4j.Logger 吗? 2) 如果是这样,是什么决定了包的 FQDN? 3) 我是否需要在特定目录中才能运行 javac?目前我正在进入 Project1 的源目录(java/bin 已经在我的 PATH 中)

很抱歉这些愚蠢的问题。我浏览了很多网站,但很多都没有涵盖最基本的内容。我希望这是有道理的。

Rgds 约翰

【问题讨论】:

    标签: java jar package


    【解决方案1】:

    1) 我还需要导入 org.apache.log4j.Logger 吗?

    是的,您这样做了,这应该可以解决您问题中的错误,因为您的 CLASSPATH 是正确的。

    2) 如果是,包的 FQDN 由什么决定?

    import 不会更改包的 FQDN。它只允许您在该文件中将org.apache.log4j.Logger 简单地称为Logger

    3) 我是否需要在特定目录中才能运行 javac?

    不,但如果当前目录是您正在编译的项目的 source 目录,这是最简单的(如果不是,您可以使用 -sourcepath 选项来解决它到 javac。)

    至于运行程序,您可能想要创建一个Project1.jar 并使用清单告诉它在哪里可以找到log4j.jar,但那是a separate question

    【讨论】:

    • 好的,我添加以下行:import org.apache.log4j.Logger;然后它返回这个.....“包 org.apache.log4j 不存在”谢谢您的回复
    • @John Wilkinson,可能是您设置的环境变量不正确。尝试将类路径移动到命令行,例如javac -classpath "C:\Java Projects\SharedJars\log4j-1.2.15.jar" -d ..\classes com\myApp\Monitor.java 看看会不会有什么不同。
    • 就是这样!我需要了解为什么我的 CLASSPATH 变量没有被正确评估,但这是另一个问题。非常感谢所有回复
    【解决方案2】:

    欢迎来到 SO。

    回答这个问题:

    我还需要导入 org.apache.log4j.Logger 吗?

    是的,您总是需要使用任何您想使用的类的导入指令。除非你告诉它,否则 Java 不会加载任何东西,即使它在类路径上。

    如果是,是什么决定了包的 FQDN?

    在 jar 中,.class 文件位于像这样的子目录中:org/apache/log4j ... 等。这就是 FQDN 的确定方式,它基本上用作命名空间结构,因此您可以拥有两个或多个相同的类名称——这也是为什么 Java 不能在类路径上加载所有内容的原因。如果是这样,它将无法消除歧义并确定您想要哪个类。

    我是否需要在特定目录中才能运行javac

    没有。您可以从任何提供类路径的任何地方运行它,无论您身在何处,都可以访问您的依赖项。如果在命令行中指定,它可能是相对类路径,如果在环境变量中指定,则可能是绝对路径。同样,您无需在特定目录中即可使用java,但您确实需要它才能到达正确的位置。

    【讨论】:

    • 非常感谢您的回复。在 finnw 的帮助下,我现在在 javac 命令上设置 -classpath,明确引用了成功的 log*jar
    • 太好了,很高兴它现在可以工作了!我为他的努力 +1 了他的回答!
    • Java 可以在不使用导入的情况下加载类,每次使用它们时都必须完全限定它们,并且它们必须位于类路径中,例如org.apache.log4j.Logger log = new org.apache.log4j.Logger();
    • @Kelly 是真的。我确实没有提到 org.apache.log4j.Logger x = new org.apache.log4j.Logger() 会起作用...
    【解决方案3】:

    我发布我的解决方案是因为上述解决方案都不适合我。它适用于 Windows XP/7。

    解决方案

    1. 从 log4j 站点 [1] 下载 zip 或 tar 包到您的计算机并解压缩下载的文件。
    2. 将文件 log4j-VERSION.jar 复制到您的 LOG4J_ISTALLATION_DIR(例如 c:\javalibs\log4j-1.2.16.jar)
    3. 打开“我的电脑/计算机”的属性(图标应该放在桌面上,只需在其上单击鼠标右键并选择属性)
    4. 打开选项卡“高级系统设置”。
    5. 打开标签“高级”
    6. 点击“环境变量”按钮。
    7. 在“环境变量”区域找到变量CLASSPATH,与左键匹配,然后单击“编辑”按钮。
    8. 粘贴/键入 log4j 库的路径 - LOG4J_ISTALLATION_DIR\log4j-VERSION.jar; (例如 c:\javalibs\log4j-1.2.16.jar;)
    9. 点击“确定”按钮。
    10. 单击“环境变量”窗口中的“确定”按钮。
    11. 单击“系统属性”窗口中的“确定”按钮。
    12. 转到命令行并通过尝试 log4j 简短教程中的示例来检查是否一切正常(附在下面):

      cd c:\Users\User\log4j
      javac MyApp2.java
      2012-03-30 21:32 510 酒吧班
      2012-03-30 21:24 177 Bar.java
      2012-03-30 21:26 334 MyApp2-log4j.properties
      2012-03-30 21:32 916 MyApp2.class
      2012-03-30 21:25 775 MyApp2.java
      java MyApp2 MyApp2-log4j.properties
      0 [main] INFO MyApp2 - 进入应用程序
      2 [main] 调试栏 - 又做了一次
      3 [main] INFO MyApp2 - 退出应用程序

    上下文:准备使用一些 *jar 文件的程序 [1](问题来源):

    // 1. 转到您的源目录(例如 c:\Users\Hopbit\log4j )

    // 2.在Bar下面创建类并保存为Bar.java

    import org.apache.log4j.Logger;
    
    public class Bar {
      static Logger logger = Logger.getLogger(Bar.class);
      public void doIt() {
        logger.debug("Did it again!");
      }
    }
    

    // 3. 在MyApp2类下面创建并保存为MyApp2.java

    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    public class MyApp2 {
    
      static Logger logger = Logger.getLogger(MyApp.class.getName());
    
      public static void main(String[] args) {
    
        // BasicConfigurator replaced with PropertyConfigurator.
        PropertyConfigurator.configure(args[0]);
    
        logger.info("Entering application.");
        Bar bar = new Bar();
        bar.doIt();
        logger.info("Exiting application.");
      }
    }
    

    // 4. 创建并保存包含以下代码的 MyApp2-log4j.properties 文件:

    # Set root logger level to DEBUG and its only appender to A1.
    log4j.rootLogger=DEBUG, A1
    
    # A1 is set to be a ConsoleAppender.
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    
    # A1 uses PatternLayout.
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
    

    // 5. 尝试编译上面的例子,它应该返回如下内容:

    > c:\Users\Hopbit\log4j>javac MyApp2.java
    > MyApp2.java:1: package org.apache.log4j does not exist
    > import org.apache.log4j.Logger;
    >                         ^
    > // [...] SOME OTHER ERRORS HERE
    

    链接和提示

    [1] http://logging.apache.org/log4j/1.2/manual.html(“log4j 简介:Ceki GŁlcŁ,2002 年 3 月”)
    [2]http://logging.apache.org/log4j/1.2/download.html
    [3] 上述解决方案建立在文件 INSTALL 中,该文件位于 log4j 包下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2014-12-17
      相关资源
      最近更新 更多