主要使用QProces执行java程序 使用到下面的代码操作
QString sPath, javaBin, jrePath, javaHome, jreClass, javaClass;
do {
sPath = QFileDialog::getExistingDirectory(
this, QString("选择jdk所在目录"),
QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (sPath.isEmpty() == true) {
jdkPath.clear();
break;
}
// "JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_181"
jdkPath = sPath;
javaBin = jdkPath + "/bin";
jrePath = jdkPath + "/jre/bin";
//"CLASSPATH=.;C:\\Program Files\\Java\\jdk1.8.0_181\\lib;C:\\Program
// Files\\Java\\jdk1.8.0_181\\lib\\tools.jar"
javaClass = jdkPath + "/lib/dt.jar";
jreClass = jdkPath + "/lib/tools.jar";
if (false == isDirExist(javaBin) || false == isDirExist(jrePath)) {
QMessageBox::information(this, "警告:", "不是有效的jdk目录");
break;
}
QStringList sysPathList = QProcessEnvironment::systemEnvironment()
.value(QString("Path"))
.split(";");
QStringList filterList = sysPathList.filter("jdk");
for (int index = 0; index < filterList.count(); index++) {
sysPathList.removeOne(filterList[index]);
}
/* 添加环境 */
/* dex运行环境 */
sysPathList.insert(
0, QDir::toNativeSeparators(QCoreApplication::applicationDirPath() +
QString("/app/bin")));
/* jdk运行环境 */
/* PATH */
sysPathList.insert(0, QDir::toNativeSeparators(jrePath));
sysPathList.insert(0, QDir::toNativeSeparators(javaBin));
/* classPath */
QStringList classList;
classList << "." << QDir::toNativeSeparators(javaClass)
<< QDir::toNativeSeparators(jreClass);
/* JAVA_HOME */
QProcessEnvironment env;
env.insert("JAVA_HOME", QDir::toNativeSeparators(jdkPath));
env.insert("CLASSPATH", classList.join(";"));
env.insert("Path", sysPathList.join(";"));
qputenv("JAVA_HOME",
QDir::toNativeSeparators(jdkPath).toStdString().c_str());
qputenv("CLASSPATH", classList.join(";").toStdString().c_str());
qputenv("Path", sysPathList.join(";").toStdString().c_str());
procCov.setProcessEnvironment(env);
ui->jdkEdit->setText(QDir::toNativeSeparators(jdkPath));
procCov.start("javac");
procCov.waitForFinished(30000);
} while (0);
先讲下流程:
1. 路径选择到jdk目录,
2. QProcessEnvironment::systemEnvironment() 获取当前系统环境
3. 提取环境中的PATH(防止环境重复,剔除了jdk)即可
4. 根据输入的jdk构造 JAVA_HOME,CLASSPATH, PATH三个环境
5. 配置env 同时设置给process.
测试代码:https://gitee.com/smalleryuan/dex-merger
如果问题,欢迎来讨论.