我java -classpath以前成功地使用了通配符扩展功能.我目前遇到了一个奇怪的问题.
通配符应该扩展到jar指定文件夹中的每个文件夹.以下是Oracle的一句话:
Class path entries can contain the basename wildcard character *,
which is considered equivalent to specifying a list of all the files
in the directory with the extension .jar or .JAR. For example, the
class path entry foo/* specifies all JAR files in the directory
named foo. A classpath entry consisting simply of * expands to a
list of all the jar files in the current directory.
Run Code Online (Sandbox Code Playgroud)
这是关于classpath主题的Java 6上的Oracle doc链接.
我看到的行为与此相矛盾.这是3次运行.第一个明确地命名jar,所以它的工作原理.其他人使用通配符并失败.为什么?这对我来说很重要,因为我依赖通配符(其他地方),所以对这种意外行为的理解对我来说很重要.
#!/bin/bash
printf "The EV is...\n"
echo $CLASSPATH
printf "The working directory is...\n"
pwd
printf "Directory listing...\n"
ls
printf "END of directory listing.\n"
printf "Test with named jar.\n"
java -javaagent:../sizeof/sizeof.jar -classpath ./testsizeof.jar info.zqxj.test.Tester
printf "Test with star.\n"
java -javaagent:../sizeof/sizeof.jar -classpath * info.zqxj.test.Tester
printf "Test with dot slash star.\n"
java -javaagent:../sizeof/sizeof.jar -classpath ./* info.zqxj.test.Tester
Run Code Online (Sandbox Code Playgroud)
输出:
The EV is...
The working directory is...
/home/b/Documents/workspace/testsizeof
Directory listing...
bin run.sh src testsizeof.jar
END of directory listing.
Test with named jar.
40
Test with star.
Exception in thread "main" java.lang.NoClassDefFoundError: run/sh
Caused by: java.lang.ClassNotFoundException: run.sh
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: run.sh. Program will exit.
Test with dot slash star.
Exception in thread "main" java.lang.NoClassDefFoundError: //run/sh
Caused by: java.lang.ClassNotFoundException: ..run.sh
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: ./run.sh. Program will exit.
Run Code Online (Sandbox Code Playgroud)
解决方案,双引号classpath参数.示例: -classpath "*" 这在命令行以及bash脚本中是必需的.
随后的附录:
此外,请注意-classpath "~/folder/*"失败但-classpath ~/folder/"*"很好.引用通配符但不引用~.您似乎需要操作系统来解释,~但您需要引用*通配符,因为您希望将其传递给javaJava方式进行扩展.
另请注意,您不应该要求java扩展,*.jar因为这会产生意想不到的结果.Java规范说正确的通配符就是*单独的.
| 归档时间: |
|
| 查看次数: |
2650 次 |
| 最近记录: |