13
export CLASSPATH=.;../somejar.jar;../mysql-connector-java-5.1.6-bin.jar
java -Xmx500m folder.subfolder../dit1/some.xml
cd ..

上面将类路径设置为linux中已经存在的类路径的语句是否正确

4

5 回答 5

27

我不喜欢设置 CLASSPATH。CLASSPATH 是一个全局变量,因此它是邪恶的:

  • 如果你在一个脚本中修改它,突然一些java程序会停止工作。
  • 如果你把你运行的所有东西的库放在那里,它就会变得杂乱无章。
  • 如果两个不同的应用程序使用同一库的不同版本,则会发生冲突。
  • 由于 CLASSPATH 中的库不是共享的,因此没有性能提升 - 只是它们的名称是共享的。
  • 如果您将点 (.) 或任何其他相对路径放在 CLASSPATH 中,这在每个地方都意味着不同的东西 - 这肯定会引起混乱。

因此,首选方法是为每次运行 jvm 设置类路径,例如:

java -Xmx500m -cp ".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar"    "folder.subfolder../dit1/some.xml

如果它变得很长,标准过程是将其包装在 bash 或批处理脚本中以节省输入。

于 2009-02-24T08:20:11.880 回答
18

除非您有充分的理由,否则始终建议不要破坏性地破坏现有的类路径。

以下行保留现有的类路径并添加到它上面。

export CLASSPATH="$CLASSPATH:foo.jar:../bar.jar"
于 2009-02-24T08:09:25.963 回答
15

在 Windows 和 Linux 中设置 Classpath 的重要区别是路径分隔符“;” Windows 中的(分号)和 Linux 中的“:”(冒号)。也%PATH%用于表示 Windows 中现有路径变量的值,而${PATH}在 Linux 中用于相同目的(在 bash shell 中)。这是在 Linux 中设置类路径的方法:

export CLASSPATH=${CLASSPATH}:/new/path

但因此 Classpath 非常棘手,您可能想知道为什么即使设置了正确的 Classpath,您的程序也无法运行。注意事项:

  1. -cp选项覆盖CLASSPATH环境变量。
  2. Manifest 文件中定义的类路径会覆盖两者-cpCLASSPATH环境变量。

参考:Classpath 如何在 Java中工作。

于 2011-12-01T09:19:40.420 回答
6

linux 下的路径由冒号 ( :) 分隔,而不是分号 ( ;),因为 theatrus 在他的示例中正确使用了它。我相信 Java 尊重这个约定。

编辑

作为andy 建议的替代方案,您可以使用以下形式(在命令期间设置 CLASSPATH):

CLASSPATH=".:../somejar.jar:../mysql-connector-java-5.1.6-bin.jar" java -Xmx500m ...

哪个对你更方便。

于 2009-02-24T08:11:39.327 回答
1

对于 linux 用户,总结和补充其他人在这里所说的内容,您应该知道以下内容:

  1. 全局变量并不邪恶。$CLASSPATH 特别是 Java 用来查看多个目录以查找脚本所需的所有不同类(除非您使用 -cp 覆盖明确告诉它)。

  2. 冒号 (":") 字符分隔不同的目录。只有一个 $CLASSPATH 并且其中包含所有目录。因此,当您运行“export CLASSPATH=....”时,您希望包含当前值“$CLASSPATH”以附加到它。例如:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
    

    在上面的第一行中,您只使用一个简单的“点”来启动 CLASSPATH,它是您当前工作目录的路径。这样,每当您运行 java 时,它都会在当前工作目录(您所在的目录)中查找类。在上面的第二行中,$CLASSPATH 获取您之前输入的值 (.) 并将路径附加到 mysql 驱动程序。现在,java 将为您的类查找驱动程序和。

  3. echo $CLASSPATH
    

    非常方便,它返回的内容应该像冒号分隔的列表一样,您希望 java 查找运行脚本所需的所有目录。

  4. Tomcat 不使用 CLASSPATH。在此处阅读如何处理:https ://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

于 2020-01-20T17:46:23.713 回答