Eclipse和javac的构建函数之间有什么区别?

时间:2016-09-20 03:03:04

标签: java eclipse maven spring-mvc

我发现Eclipse中的项目有自己的类路径。

如果我使用maven创建一个新的Web项目。

System.getProperty("java.class.path");

当我打印结果时, 我发现类路径包含G:\ newtool \ workspace \ springmvc \ target \ classes。

谁可以解释它背后的原理。为什么类路径是这个目录。 Eclipse的构建函数是否与命令javac -classpath?

相同

我发现了另一个问题。

public class KnightMain {
public static void main(String[] args) throws Exception {
    System.setProperty("java.class.path","G:/newtool/workspace;G:/newtool");
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");
    Knight knight = context.getBean(Knight.class);
    knight.embarkOnQuest();
    String s[] = System.getProperty("java.class.path").split(";");
    for (String string : s) {
        System.out.println(string);
    }
    context.close();
}

}

虽然我将类路径设置为knight.xml不存在的其他目录。但ClassPathXmlApplicationContext最终找到它。为什么

System.setProperty("java.class.path","G:/newtool/workspace;G:/newtool");

没有区别。虽然打印结果是:

G:/newtool/workspace G:/newtool

2 个答案:

答案 0 :(得分:4)

两种不同的工具,两种不同的概念。

首先,eclipse有自己的 java编译器。它没有以任何方式使用 javac 。而eclipse编译器使用的类路径,令人惊讶的是,告诉它的是什么。

换句话说:在创建eclipse项目时,可以配置其构建路径构建路径确定应导入,导出哪些库,其他项目......等等。

然而,当您像shell一样打开命令并直接调用javac时,类路径基于您在那里设置的设置;例如,通过调用

javac -classpath /some/directory/with/classes:/some/bla.jar

或者在你的情况下:你正在使用maven,它带有预定义的规则,项目依赖性等等。因此,您的类路径取决于maven为“java web projects”应用的约定/规则。因此:如果你想了解maven为你做了什么:你必须研究你在那里使用的功能的maven文档!

编辑:我认为你真正尝试的是无法奏效的。我认为这个特定的系统属性更像是“只读”值。含义:您可以使用它来理解当前类路径。但是编写属性将更改当前运行的JVM的类路径。 实际上,这很有意义:如果任何一段java代码可以动态改变类路径,那就会在整个地方尖叫“安全问题”!因为这将允许您完全更改JVM从其中加载其类的位置。

答案 1 :(得分:1)

JVM使用java.class.path属性来定位要加载的类和JAR文件。此系统属性适用于大多数可用的JVM,包括Oracle和IBM实现。此属性由默认类加载器使用,但不是所有自定义类加载器。您可以实现自己的类加载器,忽略java.class.path并使用其他属性来定位特定于加载器的包。一个例子是Eclipse。 Eclipse核心有一个不使用java.class.path的自定义类加载器。