I'm having some problems with NoClassDefFoundError, and I'm trying my best to understand the reason, so I can fix it. I think I configured my classes correctly, but maybe I missed something.
Here is my mistake:

Here is my code (I replaced all direct links to my user profile with [USER]):
Also, this is usually called from the user interface I created, and not from the command line, but since I didn’t get any errors, I modified it to run from the command line for testing ... since I still could not determine log4j yet.
import java.io.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.*; import java.sql.SQLException; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import org.apache.poi.hssf.usermodel.*; import org.apache.log4j.Logger; public class FilePrepMainStart { //declare variables on the class level static String fullinpath, fulloutpath, inpath, outpath, infilename, outfilename, outorigfn, delimiter, logfn; static boolean istextfile, isexcelfile, addrecid; //static Logger log; //Create contructor with arguments public void FilePrepMainStart(String in, String out, boolean txt, boolean exl, boolean rec, String delim) { this.fullinpath = in; this.fulloutpath = out; this.istextfile = txt; this.isexcelfile = exl; this.addrecid = rec; this.delimiter = delim; } private static String getPath(String in) { //Attempts to extract the directory path from the full file path Pattern pathPattern = createPattern("^([az]\\:.*\\\\)([a-zA-Z0-9 \\_\\$\\!\\?\\+\\%\\#\\@\\)\\(\\-\\.]+\\.[a-zA-Z0-9]{3,4})$"); Matcher filePath = pathPattern.matcher(in); if (filePath.find()){ return filePath.group(1); } else { return null; } } private static String getFileName(String in) { //Attempts to extract the sile name from the full file path Pattern namePattern = createPattern("^([az]\\:.*\\\\)([a-zA-Z0-9 \\_\\$\\!\\?\\+\\%\\#\\@\\)\\(\\-\\.]+\\.[a-zA-Z0-9]{3,4})$"); Matcher filename = namePattern.matcher(in); if (filename.find()){ return filename.group(2); } else { return null; } } private static Pattern createPattern(String pattern){ //Creates a compiled Pattern object from a String pattern //args- pattern: String containing regex pattern to be compiled Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); return p; } public static String appendOut(String name, String append) { //Adds the string "append" to the file name on output. //First checks for a file extension //Used to create a "_Clean" and "_Original" file Pattern filePattern = createPattern("(.*)(\\.[a-z0-9]{3,4})$"); Matcher fileMatcher = filePattern.matcher(name); String outfilename = name; if (fileMatcher.find()) { outfilename = fileMatcher.group(1) + append + fileMatcher.group(2); } else { outfilename = outfilename + append; } return outfilename; } public static String appendOut(String name, String append, boolean excludeext) { //Overloaded appendOut to allow prevention of adding extension back into the fn //Adds the string "append" to the file name on output. //First checks for a file extension //Used to create a "_Clean" and "_Original" file //boolean excludeext: True to exclude adding the file extension back into the file name //False for default (non-overloaded) functionality Pattern filePattern = createPattern("(.*)(\\.[a-z0-9]{3,4})$"); Matcher fileMatcher = filePattern.matcher(name); String outfilename = name; if (fileMatcher.find() && excludeext) { outfilename = fileMatcher.group(1) + append; } else if (fileMatcher.find()) { outfilename = fileMatcher.group(1) + append + fileMatcher.group(2); } else { outfilename = outfilename + append; } return outfilename; } private static int chkEXLFile(String name) { //Checks Excel file type String pattern = "(.*)\\.([a-z0-9]{3,4})$"; String filename = name; Pattern p = createPattern(pattern); Matcher chkFile = p.matcher(filename); if (chkFile.find()){ String file_ext = chkFile.group(2).toLowerCase(); if (file_ext.equals("xls")) { //XLS file return 0; } else if (file_ext.equals("xlsx")) { //XLSX File return 1; } else { //Unrecognized - Not XLS or XLSX file return -1; } } else { //Unrecognized - Not XLS or XLSX file return -1; } } public static void openXLSFileStream(String input, String output, boolean rec, String worksheet) throws FileNotFoundException, IOException { //Opens input and output streams and kicks off processing FileInputStream in = new FileInputStream(input); HSSFWorkbook inbk = new HSSFWorkbook(in); FileOutputStream out = new FileOutputStream(output); HSSFWorkbook outbk = new HSSFWorkbook(); if (rec) { processXLSFileWithRecID(in, inbk, out, outbk, worksheet); } else { } } private static void processXLSFileWithRecID(FileInputStream in, HSSFWorkbook inbk, FileOutputStream out, HSSFWorkbook outbk, String worksheet) throws FileNotFoundException, IOException { /* Reads in and loops through each excel cell to clean it * Need to add functionality to create a new workook, could be added for each part of the loop */ Pattern pattern = createPattern("[^-a-z_0-9\"/\\t\\.#@\\|, ]"); int sheetnum = -1; int sheets = inbk.getNumberOfSheets(); //Get the worksheet number for the worksheet requested for (int i = 0; i < sheets; i++) { if (worksheet.equals(inbk.getSheetName(i))) { sheetnum = i; break; } } //To Do: If no worksheet is present, sheetnum will be -1, and an error should be raised if (sheetnum == -1) {} HSSFSheet sheet = inbk.getSheetAt(sheetnum); int rows = sheet.getPhysicalNumberOfRows(); HSSFSheet outsheet = outbk.createSheet(); //Loop through each row of the sheet for (int r = 0; r < rows; r++) { HSSFRow row = sheet.getRow(r); if (row == null) { continue; } HSSFRow outrow = outsheet.createRow(r); int cells = row.getPhysicalNumberOfCells(); //Loop through each cell of the sheet for (int c = 0; c < cells; c++) { HSSFCell cell = row.getCell(c); String s = null; HSSFCell outcell = outrow.createCell(c); //Grab the cell value and assign it to variable s, based on the cell type switch(cell.getCellType()) { case HSSFCell.CELL_TYPE_FORMULA: s = cell.getCellFormula(); break; case HSSFCell.CELL_TYPE_NUMERIC: s = Double.toString(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_STRING: s = cell.getStringCellValue(); break; default: } Matcher matcher = pattern.matcher(s); //If a match is found in the string: if (matcher.find()) { //Replace all matches String repl = matcher.replaceAll(" "); outcell.setCellValue(repl); } else { outcell.setCellValue(s); } } } outbk.write(out); out.close(); } public static void run(String in, String out, boolean txt, boolean exl, boolean rec, String delim, String worksheet) { //Primary run process //Takes String args in, out, delim, and worksheet //in, out are file names for input and output files; delim is delimiter for adding recid on txt files //worksheet is the name of the worksheet that needs to be processed on Excel type files //Takes boolean args txt, exl, and rec //txt and exl indicate file type, diff file types have diff processing //rec indicates is a record id is requested to be added to the file try { delimiter = delim; outfilename = appendOut(out, "_Clean"); outorigfn = appendOut(out, "_Original"); //For when I add in logging logfn = appendOut(in, "_LogFile.txt", true); if (txt) { openTXTStreams(in, outfilename, outorigfn, delimiter, rec); } else if (exl) { int inflg = chkEXLFile(in); int outflg = chkEXLFile(out); if (inflg == 0) { //throw new Exception("test"); openXLSFileStream(in, out, rec, worksheet); } else if (inflg == 1) { } else { } } else { } } catch(Exception ex){ ex.printStackTrace(); } } public static void main(String[] args) { String in = "D:\\Users\\[USER]\\Documents\\Java\\FilePrep\\TestFiles\\Name Address Phone.xls"; String out = "D:\\Users\\[USER]\\Documents\\Java\\FilePrep\\TestFiles\\Name Address Phone_Out.xls"; boolean txt = false; boolean exl = true; boolean rec = false; String delim = ","; String worksheet = "Sheet1"; run(in, out, txt, exl, rec, delim, worksheet); } }
Here is the command I use to compile:
"C:\Program Files\Java\jdk1.7.0\bin\javac.exe" -d D:\Users\[USER]\Documents\Java\FilePrep\fileprep -classpath D:\Users\[USER]\Documents\Java\FilePrep\fileprep;D:\Users\[USER]\Documents\Java\FilePrep\fileprep\lib\log4j-1.2.13.jar;D:\Users\[USER]\Documents\Java\Libraries\Apache\poi-3.9\poi-ooxml-3.9-20121203.jar;D:\Users\[USER]\Documents\Java\Libraries\Apache\poi-3.9\poi-3.9-20121203.jar D:\Users\[USER]\Documents\Java\fileprep\sources\fileprep\FilePrepMainStart.java
And finally, here is the command that I am currently using to check the launch from the application directory:
java FilePrepMainStart -classpath D:\Users\[USER]\Documents\Java\FilePrep\fileprep;lib\log4j-1.2.13.jar;lib\poi-ooxml-3.9-20121203.jar;lib\poi-3.9-20121203.jar;lib\commons-codec-1.5.jar;lib\stax-api-1.0.1.jar;lib\commons-logging-1.1.jar;lib\xmlbeans-2.3.0.jar;lib\dom4j-1.6.1.jar
This is the first real Java program I tried to do. The goal is a simple application to clear special characters from a data file. I was able to correctly configure a simple text file, however I cannot get the program to work with Apache POI for Excel files.
I work through UltraEdit, since I do not have installation permissions to use an IDE, such as Eclipse or NetBeans, at work. However, the IDE can really help, as I am so new to this. For some time I struggled with this, and this is a road block that prevents me from fully developing in Java. I investigated the error and tried to change the paths to my classes. I do not have permission to change the PATH environment variable, but I do not know if it would cause or not. I also tried moving my JAR files to another location.
Can someone help me determine what I am missing, or point me in the right direction? I'm going crazy about this. I feel that I should be able to understand this if I were a programmer worthy of his weight in salt, but obviously I'm not there yet. I appreciate any suggestions.
Thanks!