だから私はOSX/Linuxで正しく動作するクロスプラットフォームのブートストラッププログラムに取り組んでいますが、Windowsでは次のエラーメッセージを返します:
エラー:Java仮想マシンを作成できませんでした。エラー:致命的な例外が発生しました。プログラムは終了します。認識されないオプション:-cp C:/myapp/realm/bin/Launcher.jar; C:/myapp/_jvm/jre/../lib/tools.jar; C:/myapp/realm/shared/lib/jetty-util -8.1.4.v20120524.jar
ProcessBuilder引数のリストを印刷し、コマンドラインでそれらの引数を実行すると、正常に実行されます。コマンドは次のようになります
C:/myapp/_jvm/jre\bin\java -javaagent:C:/myapp/realm/bin/spring-agent.jar -cp C:/myapp/realm/bin/Launcher.jar; C:/ myapp / _jvm /jre/../lib/tools.jar; C:/myapp/realm/shared/lib/jetty-util-8.1.4.v20120524.jar -Xmx256m -Xms200m -Xss128k -XX:+ UseBiasedLocking -XX:+ UseNUMA -DprocessType = realm -Dcert.framework.license = C:/myapp/realm/license/my.license -Djav a.security.policy = C:/myapp/realm/security/java.policy -Djava.security.properties = C:/myapp/realm/security/java.security -Djava.secur ity.auth.login.config = C:/myapp/realm/security/jaas.conf -Drealm.home = C:/ myapp /realm-Duser。 dir = C:/ myapp / realm / bin -Djava.endorsed.dirs = C:/ myapp / realm / endorsed; C:/ myapp / _jvm / jre / lib / endorsed -Djava.ext.dirs = C:/ myapp / realm / ext; C:/ myapp / _jvm / jre / lib / ext -Dlog4j.configuration = file:C:/myapp/realm/conf/log4j.properties-Dorg.apache.commons.logging.Log=またはg.apache .commons.logging。impl.Log4JLogger com.myapp.launcher.ProviderLauncher
クラスパスの前後に引用符を付けてみましたが、ダブルスラッシュなどを使用しても役に立ちませんでした。コードは次のとおりです。
String mainClass = args[0]; String propFile = args[1]; FileInputStream fis =new FileInputStream(propFile); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String line = null; ArrayList<String> argList = new ArrayList<String>(); while((line = br.readLine()) != null){ if(line.startsWith("#")) continue; String trimmedLine = line.trim(); if(trimmedLine.isEmpty()) continue; Matcher m = p.matcher(trimmedLine); StringBuffer sb = new StringBuffer(); while(m.find()){ String content = m.group(1); String envContent = System.getenv(content); if(envContent == null || envContent.isEmpty()) envContent = System.getProperty(content); m.appendReplacement(sb, envContent); } m.appendTail(sb); if(!sb.toString().startsWith("\"-") && !sb.toString().startsWith("-") && argList.size() > 0) argList.set(argList.size()-1, argList.get(argList.size()-1)+File.pathSeparator+sb.toString()); else argList.add(sb.toString()); } ArrayList<String> cmdList = new ArrayList<String>(); cmdList.add(System.getenv("JAVA_HOME") + File.separator + "bin" + File.separator + "java"); cmdList.addAll(argList); cmdList.add(mainClass); System.out.println(cmdList.toString()); ProcessBuilder pb = new ProcessBuilder(cmdList); new ProcessBuilder(line); File f = new File(System.getenv("MY_DIR") + File.separator + "logs" +File.separator + "provider-console.log"); if(!f.exists()) f.createNewFile(); pb.redirectErrorStream(true); pb.redirectOutput(f); pb.directory(new File(System.getenv("MY_DIR") + File.separator + "bin")); Process p = pb.start();
toStringedcmdListは次のとおりです。
[C:/ myapp / _jvm / jre \ bin \ java、-javaagent:C:/myapp/realm/bin/spring-agent.jar、-Xmx256m、-Xms200m、-Xss128k、-XX:+ UseBiasedLocking、-XX: + UseNUMA、-cp C:/myapp/realm/bin/Launcher.jar; C:/myapp/_jvm/jre/../lib/tools.jar; C:/myapp/realm/shared/lib/jetty-util -8.1.4.v20120524.jar、-DprocessType = realm、-Dcert.framework.license = C:/myapp/realm/license/jericho.license、-Djava.security.policy=C:/myapp/realm/security/ java.policy、-Djava.security.properties = C:/myapp/realm/security/java.security、-Djava.security.auth.login.config=C:/myapp/realm/security/jaas.conf、-Drealm .home = C:/ myapp / realm、-Duser.dir = C:/ myapp / realm / bin、-Djava.endorsed.dirs = C:/ myapp / realm / endorsed; C:/ myapp / _jvm / jre / lib / endorsed、-Djava.ext.dirs = C:/ myapp / realm / ext; C:/ myapp / _jvm / jre / lib / ext、-Dlog4j.configuration = file:C:/ myapp / realm / conf/log4j。プロパティ、-Dorg.apache.commons.logging.Log=org。apache.commons.logging.impl.Log4JLogger、com.myapp.launcher.ProviderLauncher]