今天在進行代碼集成測試的時候,對集成測試的java代碼進行 run-Junit Test,本來應該console應該打印出來運行信息的
但是實際console打印出來的如下圖所示:
個人覺得相當好奇,但是在同一個workset的里面的其他工程就沒有問題
根據eclipse的運行原理,其實run-junit Test 就是 執行javaw –classpath ***/**.jar ***/***/Test 類似的命令 和run-application 其實是一樣的。那么就寫了添加了一個main方法,期望應該是一樣的結果,果真運行run-application之后,console顯示的結果和上面的一樣
開始覺得是eclipse的問題或者修改過代碼的問題,重新下載了代碼和新的eclipse結果都還是一樣,后來又確認了jvm的版本,全部都是用jdk1.6.0_31的版本,以前的版本都刪除了,但是還是一樣的問題。
在推理,發現workset的其他工程里面的代碼都是可以運行的,發現估計和eclipse和jvm沒有太大的關系。聯想到這個工程依賴的jar包很多,是不是和這個有關。先刪除了部分依賴的jar包(刪除了一半),在運行程序,發現沒有報以上錯誤了。覺得問題可能出現在這里。 初步懷疑是不是classpath太長,導致javaw 命令無法執行。
我們所有的功能依賴jar都是通過mvn管理的,默認mvn倉庫是c:\documents and settings\用戶名\repository里面, 所以每一個依賴的jar包,都有這個前綴,我先減少這個前綴嘗試一下,所以就把默認的repo目錄指向了d:\repo目錄,重新編譯執行依賴,刷新eclipse代碼,再次執行run-application,發現程序正常運行。后來為了驗證我的猜測,寫了一段代碼進行驗證:
public class Test { public static void main(String[] args) throws Exception { StringBuilder sb = new StringBuilder(); sb.append("javaw "); sb.append("-classpath "); //構造長的路徑classpath for (int i = 0; i < 1000; i++) { sb.append("D:/repo/log4j/log4j/1.2.13/log4j-1.2.13.jar,"); } sb.deleteCharAt(sb.length() - 1); sb.append(" com.company.test.Test"); System.out.println(sb.toString()); //執行命令 Process process = Runtime.getRuntime().exec(sb.toString()); //打印結果 List<String> list = IOUtils.readLines(process.getInputStream()); for (String s : list) { System.out.println(s); } } }
運行這段代碼,應該打印出來的結果和上面一樣,結果如下,符合我的猜測
Usage: javaw [-options] class [args...] (to execute a class) or javaw [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select the "server" VM -hotspot is a synonym for the "client" VM [deprecated] The default VM is client. -cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A ; separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> set a system property -verbose[:class|gc|jni] enable verbose output -version print product version and exit -version:<value> require the specified version to run -showversion print product version and continue -jre-restrict-search | -jre-no-restrict-search include/exclude user private JREs in the version search -? -help print this help message -X print help on non-standard options -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] enable assertions -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] disable assertions -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions -agentlib:<libname>[=<options>] load native agent library <libname>, e.g. -agentlib:hprof see also, -agentlib:jdwp=help and -agentlib:hprof=help -agentpath:<pathname>[=<options>] load native agent library by full pathname -javaagent:<jarpath>[=<options>] load Java programming language agent, see java.lang.instrument -splash:<imagepath> show splash screen with specified image
我們把命令打印出來,copy到cmd命令行里面執行,發現命令行不完整,被自動截取了
這個命令根本都不完整,后面指令的class丟失了,javaw參數中沒有指定要運行的類,就導致我們看到的結果。
這個可能是windows下,和shell指令的長度限制有關。