2

我注意到一个反复出现的问题:在 shell 脚本中的 java 命令行上对类路径使用 env var不起作用。

首先,让我们看看什么有效的:两者都在脚本中使用硬编码的类路径,如下所示:(注意:“类路径是”语句打印在 java 程序本身中)

steve@mithril:/shared$     java -classpath .:/shared/mysql-connector-java-5.1.25-bin.jar DbPing com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql user password
classpath is .:/shared/mysql-connector-java-5.1.25-bin.jar
Attempting connection to com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql  password
Connecting to user using URL=jdbc:mysql://localhost:3306/mysql
Successfully connected.

并且还直接在 shell 中使用 env var :

steve@mithril:/shared$ export CP=.:/shared/mysql-connector-java-5.1.25-bin.jar
steve@mithril:/shared$ java -classpath $CP DbPing com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql user password 
classpath is .:/shared/mysql-connector-java-5.1.25-bin.jar
Attempting connection to com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql  password
Connecting to user using URL=jdbc:mysql://localhost:3306/mysql
Successfully connected.

*not * 有什么作用:在 shell 脚本中运行如上所示的相同命令:

steve@mithril:/shared$ cat dbping.mysql
CP=.:/shared/mysql-connector-java-5.1.25-bin.jar
echo $CP
java -classpath $CP DbPing com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql user password 
#java -classpath .:/shared/mysql-connector-java-5.1.25-bin.jar DbPing com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql user password 

steve@mithril:/shared$  ./dbping.mysql
.:/shared/mysql-connector-java-5.1.25-bin.jar
classpath is .:/shared/mysql-connector-java-5.1.25-bin.jar
Attempting connection to com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/mysql  password
Could not load db driver com.mysql.jdbc.Driver
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:190)
    at DbPing.getConnection(DbPing.java:34)
    at DbPing.main(DbPing.java:22)
Exception in thread "main" java.sql.SQLException: com.mysql.jdbc.Driver
    at DbPing.getConnection(DbPing.java:41)
    at DbPing.main(DbPing.java:22)

跟进: 该脚本中包含 windows 样式的换行符。显然 \r 破坏了内部环境变量。发现这个使用

  od -cx

. 无论如何,我还是要感谢 stephen c,因为他的鼓励让我走上了寻找解决方案的正确轨道

4

1 回答 1

1

你描述的症状相当令人费解。我看不到问题(脚本看起来正确),但我知道如何开始跟踪它。

  1. 摆脱脚本中注释掉的行。

  2. 在脚本的开头添加#!/bin/sh一行,以确保您实际上使用了正确的 shell 来执行它。(这样做总是一个好主意......即使您认为默认情况下会获得正确的外壳。这可能会改变,具体取决于平台。)

  3. 要弄清楚外壳在做什么,set -vx请在行后添加 as #!/bin/sh

“-v”表示回显读取的每个脚本行,“-x”表示回显执行的实际命令行。这将准确地告诉您正在运行哪些命令......这样您就可以弄清楚命令参数的真正含义。

于 2013-06-30T22:59:46.677 回答