【问题标题】:unable to execute the jar file using java program. i need to pass the file path as a command line argument to the jar file无法使用 java 程序执行 jar 文件。我需要将文件路径作为命令行参数传递给 jar 文件
【发布时间】:2015-02-17 10:59:35
【问题描述】:

以下代码无法写入文件。

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

注意:- jar 文件也是我自己创建的。

这是我的 java 文件

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);
            }
        }


            }
}

这是jar文件代码

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();
        }
    }
}

【问题讨论】:

  • 当你...时会发生什么?
  • 你需要处理exec的返回值:存储进程,读取stdout(getInputStream)和stderr(getErrorStream)并行waitFor进程退出,然后处理退出代码。
  • 我正在执行它没有给出任何错误以及没有写入文件
  • @kal 我看到了你对其中一篇文章的评论。 stackoverflow.com/questions/8123058/… .... 我遇到了同样的问题

标签: java jar command command-line-arguments command-prompt


【解决方案1】:

问题是您在调用 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.Final 中,而不是您想要的路径使用它

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

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

我还冒昧地替换了我原帖第一部分中的内容。

【讨论】:

  • java -jar Demo.jar readExcelDemo.Final 这里“readExcelDemo.Final”表示 readExcelDemo 是一个包,Final 是 Demo.jar 文件中的一个类。我认为我所做的是正确的。是吗?
  • 是的,这应该是用于选择入口点(但为了让事情更容易,你需要多个入口点还是一个可以过关?),你可能想检查一下发帖:stackoverflow.com/a/5475076/1426565
  • 然后你可以进一步简化: Runtime.getRuntime().exec("java -jar Demo.jar " + file.getAbsolutePath());而不必担心修复顺序/参数化调用
  • 感谢@Guardanis。你说的是对的。我的代码运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2012-01-01
  • 1970-01-01
  • 2012-12-21
  • 2016-08-11
  • 2010-11-06
  • 2015-06-13
相关资源
最近更新 更多