При выполнении исполняемого файла JAR (код Java), я получаю java.lang.reflect.InvocationTargetException

В рамках одной из задач моего проекта мне нужно прочитать некоторые данные из Excel, поработать над приложением, используя эти данные через Sikuli, а затем записать результат обратно в Excel.

Это хорошо работает в Eclipse. Но когда я экспортирую файл Java в файл jar Runnable, я получаю сообщение об ошибке (трассировка стека находится внизу этого поста). Может кто-нибудь помочь мне исправить это?

Пожалуйста, найдите ниже мой код Java:

package Auto_a;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Key;
import org.sikuli.script.Screen;

public class Calculator_b {

 public static String[] temp1 = new String[50];
 public static String temp,temp2;
 public static String var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12;
 public static String var13,var14,var15,var16,var17,var18,var19,var20;
 public static String str5;
 public static String result,result_a,result_b;
 public static String[] temp_var;
 public static String result1,result2;
 public static int rowNum,colNum;
 public static String[] temp_var2 ;
 public static int x=0,flag=0;
 public static void main(String...strings) throws IOException, InterruptedException, FindFailed
    {    
  
   Screen s=new Screen();   
   Thread.sleep(2000); 
   
   s.find("D:\\Sikuli\\Calculator.PNG");    
   Thread.sleep(500);
   s.click("D:\\Sikuli\\Calculator.PNG");   
   Thread.sleep(2000);  
   
   Calculator_b objExcelFile = new Calculator_b();       

   String filePath = "D:";
   //Call read file method of the class to read data       
   objExcelFile.readExcel(filePath,"sample.xlsx","Calculator");
   
    }
 
 
 public void readExcel(String filePath,String fileName,String sheetName) throws IOException, FindFailed, InterruptedException
 {       

  //Create a object of File class to open xlsx file       
  File file =    new File(filePath+"\\"+fileName);       
  //Create an object of FileInputStream class to read excel file      
  FileInputStream fis = new FileInputStream(file);  
  
   XSSFWorkbook wb = new XSSFWorkbook(fis);
  
  //Read sheet inside the workbook by its name       
  //Sheet guru99Sheet = wb.getSheet(sheetName);   
  
     XSSFSheet ws = wb.getSheet(sheetName);

     rowNum = ws.getLastRowNum() + 1;
     System.out.println(rowNum);
     colNum = ws.getRow(0).getLastCellNum();
     System.out.println(colNum);
     String[][] data = new String[rowNum][colNum];
     temp_var2 = new String[colNum+1];

     for (int i = 1 ; i < rowNum ; i++) 
     { 
         XSSFRow row = ws.getRow(i);
             for (int j = 1 ; j < colNum ; j++) 
             {
                 XSSFCell cell = row.getCell(j);
                 String value = cellToString(cell);
                
                 data[i][j] = value ;                 
             }                           
          
      }
     
     //New Loop to assign data to Temp array
     
     for(int i1=1;i1 < rowNum ; i1++)
     {      
      for (int j1 = 1 ; j1 < colNum ; j1++) 
            {
       x=j1;
       temp_var2[x]=data[i1][j1];          
       System.out.println("value of temp_var2["+x +"]: "+ temp_var2[x]);
       x=x+1;
            }
      Calculator_a(i1);      
     }     
  
     int len111 = temp_var2.length;
     System.out.println("array len: "+len111); 
      
 }     
 
  public static String cellToString(XSSFCell cell) 
     {  
         int type;
         Object result;
         type = cell.getCellType();

         switch (type) 
         {

             case Cell.CELL_TYPE_NUMERIC: // numeric value in Excel
             case Cell.CELL_TYPE_FORMULA: // precomputed value based on formula
                 result = cell.getNumericCellValue();
                 break;
             case Cell.CELL_TYPE_STRING: // String Value in Excel 
                 result = cell.getStringCellValue();
                 break;
             case Cell.CELL_TYPE_BLANK:
                 result = "";
             case Cell.CELL_TYPE_BOOLEAN: //boolean value 
                 result = cell.getBooleanCellValue();
                 break;
             case Cell.CELL_TYPE_ERROR:
             default:  
                 throw new RuntimeException("There is no support for this type of cell");                        
         }

         return result.toString();
     }
  
  public static void WriteExcel(int var_c,String str1,String Result) 
     { 
   int var_d =var_c;
   String Actual = str1;
   String status = Result;
   try {
       FileInputStream file = new FileInputStream(new File("D:\\sample_h.xlsx"));
    
       XSSFWorkbook workbook = new XSSFWorkbook(file);
       XSSFSheet sheet = workbook.getSheet("Calculator");
       Cell cell = null;
    
       //Update the value of cell
       cell = sheet.getRow(var_d).getCell(5);      
       cell.setCellValue(Actual);
       
       cell = sheet.getRow(var_d).getCell(6);      
       cell.setCellValue(status);       

      //file.close();
        
       FileOutputStream outFile =new FileOutputStream(new File("D:\\sample_h.xlsx"));
       workbook.write(outFile);
       //outFile.close();
        
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }
  }
  
  public static void Calculator_a(int v_a)throws FindFailed, InterruptedException 
  {
   int v_b=v_a;    
  
    Screen s=new Screen();   
    Thread.sleep(2000);    
        
    s.find("D:\\Sikuli\\Calculator_c.PNG");    
    Thread.sleep(1000);
    s.click("D:\\Sikuli\\Calculator_c.PNG");     
    Thread.sleep(3000);
    
    s.type(temp_var2[1]);
    Thread.sleep(1000);
 
    s.type(temp_var2[3]);    
    Thread.sleep(1000);
    
    s.type(temp_var2[2]);
    Thread.sleep(1000);
    
    s.type(Key.ENTER);
    Thread.sleep(1000);
    
    String text1;
    text1=s.find("D:\\Sikuli\\Calculator_b.PNG").above(30).text();
    text1=text1.trim();
    System.out.println("Actual Result: "+text1);
    Thread.sleep(1000);
    String expected = temp_var2[4];
    if(expected.equals(text1))
    {
     result1="Passed";
     WriteExcel(v_b,text1,result1);     
    }
    
    else
    {
     result1="Failed";
     WriteExcel(v_b,text1,result1);      
    }
          
  }
 }

Error details:

*****sys-package-mgr*: processing new jar, 'D:\testa.jar'
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:56)
Caused by: Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named sikuli****

at org.python.core.PyException.fillInStackTrace(PyException.java:70)
        at java.lang.Throwable.<init>(Throwable.java:181)
        at java.lang.Exception.<init>(Unknown Source)
        at java.lang.RuntimeException.<init>(Unknown Source)
        at org.python.core.PyException.<init>(PyException.java:46)
        at org.python.core.PyException.<init>(PyException.java:43)
        at org.python.core.PyException.<init>(PyException.java:61)
        at org.python.core.Py.ImportError(Py.java:290)
        at org.python.core.imp.import_first(imp.java:750)
        at org.python.core.imp.import_name(imp.java:834)
        at org.python.core.imp.importName(imp.java:884)
        at org.python.core.ImportFunction.__call__(__builtin__.java:1220)
        at org.python.core.PyObject.__call__(PyObject.java:357)
        at org.python.core.__builtin__.__import__(__builtin__.java:1173)
        at org.python.core.imp.importFromAs(imp.java:978)
        at org.python.core.imp.importFrom(imp.java:954)
        at org.python.pycode._pyx0.f$0(<string>:1)
        at org.python.pycode._pyx0.call_function(<string>)
        at org.python.core.PyTableCode.call(PyTableCode.java:165)
        at org.python.core.PyCode.call(PyCode.java:18)
        at org.python.core.Py.runCode(Py.java:1261)
        at org.python.core.Py.exec(Py.java:1305)
        at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:206)
        at org.sikuli.script.Region.toJythonRegion(Region.java:993)
        at org.sikuli.script.Region.create(Region.java:130)
        at org.sikuli.script.Region.above(Region.java:331)
        at Auto_a.Calculator_b.Calculator_a(Calculator_b.java:192)
        at Auto_a.Calculator_b.readExcel(Calculator_b.java:98)
        at Auto_a.Calculator_b.main(Calculator_b.java:47)
        ... 5 more

Я чувствую, что проблема возникает при записи данных в Excel / чтении данных из Excel. Не могли бы вы предложить какое-либо решение?

Я экспортировал код Java в файл JAR в правильном порядке. Я подтвердил это, экспортировав другой пример программы, и она отлично работала. Эта проблема возникает только в программе, которая включает операции чтения и записи Excel

1 ответ

Я думаю, что это ваша проблема

Caused by: Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named sikuli****

Кажется, не в состоянии импортировать Sikuli.

Другие вопросы по тегам