QProcess设置运行环境

主要使用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

如果问题,欢迎来讨论.

扫描二维码关注公众号,回复: 14959648 查看本文章

猜你喜欢

转载自blog.csdn.net/u011624093/article/details/117819175
今日推荐