Java的-classpath选项会添加或替换CLASSPATH环境变量。

28

-classpath选项是否会添加或替换CLASSPATH环境变量的内容?


3
好问题。我从未想过这个。 - marionmaiden
1
你想知道环境变量是否已更改吗?你是否运行了测试以实际查看它是否更改了? - S.Lott
1
为什么不自己试试呢? - Eli Acherkan
2
@Zacky112,请注意,使用-jar选项运行jar文件将忽略CLASSPATH环境变量。 - James McMahon
4个回答

22

使用classpath变量可以覆盖环境变量中的CLASSPATH,但仅在该会话期间生效。如果重新启动应用程序,则需要再次设置classpath变量。


1
太好了。感谢girienie提供简明扼要的答案。你一定是Java专家 :) - Zacky112

8
使用-cp选项不会影响CLASSPATH环境变量。
您可以尝试这个小代码片段来检查:
public class CPTest {
    public static void main (final String[] args) {
        String cp = System.getenv("CLASSPATH");
        System.out.println(cp);
    }
}

%echo $CLASSPATH  
/home/test/:.

没有 -cp 选项的输出:
%java CPTest  
/home/test/:.

使用 -cp 选项的输出结果:
%java -cp /home/xanadu:. CPTest  
/home/test/:.

无论使用-cp选项还是不使用,输出结果都相同。
同时,会使用CLASSPATH环境变量指定的路径或使用-cp选项指定的路径。它们不会混合使用,只会选择其中一种方式。
从下面的调用可以看出这一点。如果将当前工作目录"."从-cp选项中排除在外,JVM启动器(即java)将无法找到类文件,即使CLASSPATH环境变量包含CWD(".")。
%java -cp /home/test CPTest
Exception in thread "main" java.lang.NoClassDefFoundError: CPTest

8

是的。引用自java(1)手册:

   -classpath classpath
   -cp classpath
          Specifies a list of directories, JAR archives, and ZIP archives to search  for  class  files.   Class
          path  entries  are separated by colons (:). Specifying -classpath or -cp overrides any setting of the
          CLASSPATH environment variable.

          If -classpath and -cp are not used and CLASSPATH is not set, the user class path consists of the cur-
          rent directory (.).

2
根据此,环境变量根本没有更新。我不明白答案怎么会是“是”。 - S.Lott
3
从谁的角度来看?从程序的角度来看,如果存在CLASSPATH值,则会被替换。从 shell 的角度来看,CLASSPATH 值不会改变。我认为原始问题只是措辞不当。 - Nate

8

只能使用其中一个选项,不能同时使用。

指定-classpath或-cp会覆盖CLASSPATH环境变量的任何设置。

...

-classpath选项更为推荐,因为您可以为每个应用程序单独设置它,而不影响其他应用程序,并且其他应用程序也不会修改其值。

...

设置CLASSPATH变量或使用-classpath命令行选项会覆盖默认设置,因此如果您想将当前目录包含在搜索路径中,则必须在新设置中包括“.”。


关于最后一点,这还是现状吗?当我运行 java -cp tests Test.java 时,似乎它仍然从“.”(当前工作目录)中发现类。 - markasoftware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接