我对Java比较陌生。我一直在使用Eclipse做一些工作,但我想回到基础,只需将文本编辑器与JDK结合使用。我现在面临的问题是Eclipse和其他IDE隐藏了很多基本的东西,这些东西对于了解和完全理解是非常重要的。这就是我想要做的事情:
我创建了一个名为“C:\ Java Projects”的目录,在该目录下我创建了3个子文件夹,Project1,Project2和SharedJars。 Project1和Project2都有SubDirs,如类和源。 Poject1源.java文件位于“c:\ Java Projects \ Project1 \ source \ com \ myApp”
Project1和Project2都是使用Log4J JAR的包,它们位于SharedJars文件夹中。在Eclipse世界中,我可以设置一些东西告诉Eclipse我的项目将使用哪些JAR,然后执行类似导入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类
private static Logger LOG;
一些问题: 1)我还需要导入org.apache.log4j.Logger吗? 2)如果是这样,什么决定了包的FQDN? 3)我是否需要在特定目录中才能运行javac?目前我要进入Project1的源目录(java / bin已经在我的PATH中)
对不起这些愚蠢的问题。我已经浏览了很多网站,但很多都没有涵盖这些基础知识。我希望这是有道理的。
RGDS 约翰
答案 0 :(得分:4)
欢迎来到SO。
回答这个问题:
我还需要导入org.apache.log4j.Logger吗?
是的,您始终需要使用任何要使用的类的import指令。除非你告诉它,否则Java不会加载任何东西,即使它在类路径上。
如果是,那么什么决定了包的FQDN?
在jar中,.class文件位于子目录中,如下所示:org/apache/log4j ...
等。这是FQDN的确定方式,它基本上用作命名空间构造,因此你可以有两个或更多类相同的名称 - 这也是Java无法在类路径上加载所有内容的原因。如果确实如此,那就无法消除歧义并找出你想要的课程。
我是否需要在特定目录中才能运行
javac
?
没有。你可以从任何地方运行它,只要你有类路径,就可以访问你的依赖项。如果在命令行中指定,则它可以是相对类路径,如果在环境变量中,则可以是绝对路径。同样,您不需要在特定目录中使用java
,但您确实需要它才能到达正确的位置。
答案 1 :(得分: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。
答案 2 :(得分:0)
我发布我的解决方案,因为以上解决方案都不适合我。它在Windows XP / 7下适用于我。
转到命令行并通过log4j简短教程(下面的attachede)中的示例检查一切是否正常工作:
cd c:\ Users \ User \ log4j
javac MyApp2.java
2012-03-30 21:32 510 Bar.class
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 [主要] INFO MyApp2 - 输入申请
2 [主要] DEBUG酒吧 - 再次确认了 3 [主要] INFO MyApp2 - 退出申请
// 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简介:CekiGŁlcŁ,2002年3月”)
[2] http://logging.apache.org/log4j/1.2/download.html
[3]上面的解决方案是在文件INSTALL中创建的,它放在uder log4j包中。