我发现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
答案 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的自定义类加载器。