当前位置: 首页 > 知识库问答 >
问题:

无法使用java程序执行jar文件。我需要将文件路径作为命令行参数传递给jar文件

郭乐意
2023-03-14

下面的代码无法写入文件。

我编写了一个程序来执行cmd中的命令。这些命令只是执行jar文件中的java文件。这个jar中的java文件需要文件路径作为命令行参数

注意:-jar文件也仅由我创建。

public class ExcelDriver extends Thread {
    public static void main(String[] args) throws IOException, InterruptedException {


        File directory = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets//custome");
        File[] files = directory.listFiles();
        for (File file: files) {
            System.out.println("\""+file.getAbsolutePath()+"\"");
            if(file.isFile()){
                Runtime.getRuntime().exec("cmd.exe /c start java -jar Demo.jar readExcelDemo.Final "+file.getAbsolutePath());
                ExcelDriver.sleep(5000);
            }
        }


            }
}
public class Final {

    public static int getExcelColumnNumber(String column) {
        int result = 0;
        for (int i = 0; i < column.length(); i++) {
            result *= 26;
            result += column.charAt(i) - 'A' + 1;
        }
        return result;
    }

    public static String getExcelColumnName(int number) {
        final StringBuilder sb = new StringBuilder();

        int num = number - 1;
        while (num >=  0) {
            int numChar = (num % 26)  + 65;
            sb.append((char)numChar);
            num = (num  / 26) - 1;
        }
        return sb.reverse().toString();
    }


    void run(File file, File errors, File misMatchs) throws IOException{


        if (file.getName().endsWith(".xlsx") || file.getName().endsWith(".xlsm")) {
            FileInputStream fis = new FileInputStream(file);

            StringBuilder error = new StringBuilder();
            StringBuilder misMatch = new StringBuilder();
            // Create Workbook instance holding reference to .xlsx file

            //OPCPackage pkg = OPCPackage.open(file, PackageAccess.READ);
            XSSFWorkbook workbook = new XSSFWorkbook(fis);
            int i = 1;
            while (i < workbook.getNumberOfSheets()) {

                // System.out.println(workbook.getNumberOfSheets());
                // Get first/desired sheet from the workbook
                XSSFSheet sheet = workbook.getSheetAt(i);
                if(sheet.getRow(0).getCell(0).getRawValue().equalsIgnoreCase("fail")){

                    // Iterate through each rows one by one
                    Iterator<Row> rowIterator = sheet.iterator();
                    while (rowIterator.hasNext()) {
                        Row row = rowIterator.next();
                        // For each row, iterate through all the columns
                        Iterator<Cell> cellIterator = row.cellIterator();
                        while (cellIterator.hasNext()) {
                            Cell cell = cellIterator.next();
                            // Check the cell type and format accordingly
                            switch (cell.getCellType()) {
                            /*
                             * case Cell.CELL_TYPE_NUMERIC:
                             * System.out.print(cell.getNumericCellValue());
                             * break; case Cell.CELL_TYPE_STRING:
                             * System.out.print(cell.getStringCellValue());
                             * break;
                             */
                            // case Cell.CELL_TYPE_FORMULA:
                            case Cell.CELL_TYPE_FORMULA:

                                if (cell.getCellFormula().startsWith("IF("))
                                    if (sheet.getRow(row.getRowNum()).getCell(cell.getColumnIndex()).getRawValue().equals("1")) {

                                        HashSet<Integer> number = new HashSet<Integer>();
                                        ArrayList<String> alphas = new ArrayList<String>();

                                        String formula = sheet.getRow(row.getRowNum()).getCell(cell.getColumnIndex()).toString();
                                        Matcher digitMatcher = Pattern.compile("\\d+").matcher(formula);
                                        Matcher alphabetMatcher = Pattern.compile("[a-zA-Z]+").matcher(formula);

                                        while (alphabetMatcher.find()) {
                                            if (!alphabetMatcher.group().equals("TYPE"))
                                                alphas.add(alphabetMatcher.group());
                                        }

                                        int countIF = Collections.frequency(alphas, "IF");
                                        int countABS = Collections.frequency(alphas, "ABS");
                                        HashSet<String> alphaSet = new HashSet<String>(alphas);
                                        if (countIF != 5 && countIF != 6)
                                            alphaSet.remove("IF");
                                        if (countABS != 3 && countABS != 4)
                                            alphaSet.remove("ABS");

                                        while (digitMatcher.find()) {
                                            if (!digitMatcher.group().equals("0") && !digitMatcher.group().equals("1") && !digitMatcher.group().equals("01"))
                                                number.add(Integer.parseInt(digitMatcher.group()));
                                        }

                                        ArrayList<Integer> numberList = new ArrayList<Integer>(number);
                                        ArrayList<String> alphaList = new ArrayList<String>(alphaSet);
                                        System.out.println("alphaSet"+ alphaSet);
                                        System.out.println("numberList"+ numberList);

                                        int rowIndex = numberList.get(0) - 1;
                                        int originalColumnIndex = getExcelColumnNumber(alphaList.get(0)) - 1;
                                        int referenceColumnIndex = getExcelColumnNumber(alphaList.get(1)) - 1;
                                        if (originalColumnIndex > referenceColumnIndex) {
                                            int temp = referenceColumnIndex;
                                            referenceColumnIndex = originalColumnIndex;
                                            originalColumnIndex = temp;
                                        }

                                        // System.out.println(sheet.getRow(row.getRowNum()));
                                        System.out.println("File Name: "+ file.getName());
                                        System.out.println("Sheet Name: "+ sheet.getSheetName());
                                        System.out.println(sheet.getRow(row.getRowNum()).getCell(cell.getColumnIndex()).toString());
                                        if (sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula().equals(""))
                                            System.out.println("please help me out");
                                        System.out.println("Function Name: "+ sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula());
                                        System.out.println("row indext"+ rowIndex);
                                        System.out.println("original column index"+ originalColumnIndex);
                                        System.out.println("ref column index"+ referenceColumnIndex);
                                        /*
                                         * System.out.println("File Name: " +
                                         * file.getName());
                                         * System.out.println("Sheet Name: " +
                                         * sheet.getSheetName());
                                         * System.out.println(cell
                                         * .getCellFormula());
                                         */
                                        if (sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula().contains("qCRA_")&& sheet.getRow(rowIndex)
                                                        .getCell(originalColumnIndex).getRawValue().contains("Error:")) {
                                            error.append(System.getProperty("line.separator"));
                                            error.append("File Name: "+ file.getName());
                                            error.append(System.getProperty("line.separator"));
                                            error.append("Sheet Name: "+ sheet.getSheetName());
                                            error.append(System.getProperty("line.separator"));
                                            error.append("Function Name: "+ sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula());
                                            error.append(System.getProperty("line.separator"));
                                            error.append("Cell Number: "+getExcelColumnName(originalColumnIndex+1)+numberList.get(0));
                                            error.append(System.getProperty("line.separator"));
                                            error.append("Orginal Value : "+sheet.getRow(rowIndex).getCell(originalColumnIndex).getRawValue());
                                            error.append(System.getProperty("line.separator"));
                                            error.append("Reference Value : "+sheet.getRow(rowIndex).getCell(referenceColumnIndex));
                                            error.append(System.getProperty("line.separator"));
                                        } else {
                                            misMatch.append(System.getProperty("line.separator"));
                                            misMatch.append("File Name: "+ file.getName());
                                            misMatch.append(System.getProperty("line.separator"));
                                            misMatch.append("Sheet Name: "+ sheet.getSheetName());
                                            misMatch.append(System.getProperty("line.separator"));
                                            misMatch.append("Function Name: "+ sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula());
                                            misMatch.append(System.getProperty("line.separator"));
                                            misMatch.append("Cell Number: "+getExcelColumnName(originalColumnIndex+1)+numberList.get(0));
                                            misMatch.append(System.getProperty("line.separator"));
                                            misMatch.append("Orginal Value : "+sheet.getRow(rowIndex).getCell(originalColumnIndex).getRawValue());
                                            misMatch.append(System.getProperty("line.separator"));
                                            misMatch.append("Reference Value : "+sheet.getRow(rowIndex).getCell(referenceColumnIndex));
                                            misMatch.append(System.getProperty("line.separator"));
                                        }
                                    }
                                break;

                            }
                            cell = null;
                        }
                        row = null;
                    }
                }
                i++;
                fis.close();
                sheet=null;
            }
            workbook=null;
            //FileUtils.writeStringToFile(errors, error.toString(),true);
            //FileUtils.writeStringToFile(misMatchs, misMatch.toString(),true);
            FileWriter errorsFileWriter = new FileWriter(errors,true);
            BufferedWriter errorsBufferedWriter = new BufferedWriter(errorsFileWriter);
            errorsBufferedWriter.write(error.toString());
            errorsBufferedWriter.flush();
            errorsBufferedWriter.close();

            FileWriter misMatchFileWriter = new FileWriter(misMatchs, true);
            BufferedWriter misMatchesBufferedWriter = new BufferedWriter(misMatchFileWriter);
            misMatchesBufferedWriter.write(misMatch.toString());
            misMatchesBufferedWriter.flush();
            misMatchesBufferedWriter.close();
        }
}



    public static void main(String[] args) {
        try {
            String filepath = args[0];//.replace("\" , ", "\\");
            //System.out.println(filepath);
            File directory = new File(filepath);

            File errors = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets//Error.txt");
            if(!errors.exists()){
                errors.createNewFile();
            }


            File mismatch = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets//Mismatch.txt");
            if(!mismatch.exists()){
                mismatch.createNewFile();
            }

            Final hvd=new Final();
            hvd.run(directory,errors,mismatch);

                    } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

共有1个答案

冯茂实
2023-03-14

问题是调用Jar文件时要传递什么。Jar文件设置为使用它接收到的第一个参数作为要使用的目录:

public static void main(String[] args) {
    ...
        String filepath = args[0];//.replace("\" , ", "\\");  // First parameter
        File directory = new File(filepath);
        ....

但当您调用它时,实际上是在传递“readExcelDemo.Final”作为第一个参数,而不是您希望目录的样子:

    File directory = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets//custome");
    ...
    for (File file: files) {
        ...
            Runtime.getRuntime().exec("java -jar Demo.jar readExcelDemo.Final " + file.getAbsolutePath()); 

因此,您的解决方案将是三件事之一:

  1. 将Jar文件更改为使用第二个输入(最简单,但不是最好的)
  2. 将实现设置为将文件路径作为第一个参数传递(第二简单,但仍然不是最好的)
  3. 参数化您发送Jar文件的内容(例如,“dir=C:/path/to/dir”),您就不必担心参数顺序(最难,但如果您可能要传递更多参数,这是值得的)

希望有帮助~

编辑:

PS:我假设你也没有得到任何异常,因为它实际上是工作的,但是包含你的结果的目录将位于你的根项目目录/readExcelDemo中。最终而不是你想让它使用的路径

PPS:此外,您的执行命令不需要的第一部分cmd.exe /cstart,而是应该替换为:

Runtime.getRuntime().exec("java -jar Demo.jar readExcelDemo.Final " + file.getAbsolutePath());

我还冒昧地在我原来的帖子的第一部分替换了这个。

 类似资料:
  • 问题内容: 如何接收文件作为命令行参数? 问题答案: 仅传递文件的路径,在程序内部使用Java File类处理它 这将第一个参数作为文件路径:

  • 我对Java比较陌生,我完成了教程,其中解释了如何创建和运行JAR文件的示例。您能告诉我在命令行中运行JAR应该做些什么吗? 我创建了JAR文件: 此Jar文件已复制到桌面 我希望命令:java-jar06_02.jar应该执行文件。 在IntelliJ终端中,我切换到桌面目录(文件所在)并运行:java-jar 06\u 02。罐子 这会导致错误: 错误:发生JNI错误,请检查您的安装并在线程“

  • 问题内容: 我如何从Java程序运行本地jar文件? jar文件不在Java调用程序的类路径中。 问题答案: 我建议你使用并启动一个新的JVM。 以下是一些入门知识:

  • 问题内容: 我已经编译了一个JAR文件,并在清单中指定了Main-Class(我使用了Eclipse Export函数)。我的依赖项都在标有的目录中。在指定应将JAR文件用作类路径的同时,我似乎无法获得关于如何执行我的JAR文件的直接答案。 我试过了: 等等… 每个都给出一个错误说: 或NoClassDefFoundError指示未找到库。 我什至尝试重新制作JAR文件,并包括lib目录和内容,但

  • 问题内容: 我从Eclipse项目构建了可运行的JAR,该项目处理给定的XML文件并提取纯文本。但是,此版本要求文件在代码中进行硬编码。 有没有办法做这样的事情 并让jar在xml文件上执行? 我已经四处查看,给出的所有示例都与在命令行上编译JAR有关,而没有一个处理传入参数。 问题答案: 为什么不 ? 只需修改您的参数即可接收论据并对其进行操作。 在命令行中指定完整路径。

  • 问题内容: 我正在尝试从.jar文件中提取文件。我该如何使用命令行? 我正在运行Windows 7 问题答案: 从文档: 要从jar文件中提取文件,请使用,如下所示: 要仅从jar文件中提取某些文件,请提供其文件名: 该文件夹可能不适合您,在我的Windows分区上是: 除非的位置在您的路径环境变量中,否则您必须指定完整路径/从文件夹内部运行程序。 编辑: 这是另一篇文章,专门针对提取JAR:ht