【问题标题】:Compile and run java program with mutiple external jar files使用多个外部jar文件编译和运行java程序
【发布时间】:2016-02-10 11:57:33
【问题描述】:

我有一个简单的程序,它使用 apache.poi 外部库来操作 excel 文件。我在 windows 环境中使用了 eclipse,现在我必须使用终端在 linux 上编译和运行我的程序。我搜索了如何包含我需要的那些罐子,但最终出现以下错误:

错误:无法找到或加载主类 xlsToCsv。

我遵循的步骤是这样的:

javac -cp ./jars/poi-3.13-20150929.jar:./jars/poi-ooxml-schemas-3.13-20150929.jar:./jars/poi-ooxml-3.13-20150929.jar:./ jars/xmlbeans-2.6.0.jar xlsToCsv.java

java -cp ./jars/poi-3.13-20150929.jar:./jars/poi-ooxml-schemas-3.13-20150929.jar:./jars/poi-ooxml-3.13-20150929.jar:./ jars/xmlbeans-2.6.0.jar xlsToCsv

我的当前目录是 /home/demo/Desktop/xls_to_csv xlsToCsv.java 文件在哪里。 jar 文件位于 /home/demo/Desktop/xls_to_csv/jars 中。

谁能告诉我并解释正确的语法?是否可以调用包含所有 jar 文件的文件夹而不是单独调用它们?

提前致谢。

编辑,我的代码:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Iterator;
    import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.ss.usermodel.FormulaEvaluator;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;

public class xlsToCsv {

    static void convert(File input, File output) throws Exception {

        StringBuffer data = new StringBuffer();

        FileOutputStream fos = new FileOutputStream(output);
        HSSFWorkbook file = new HSSFWorkbook(new FileInputStream(input));
        DataFormatter objDefaultFormat = new DataFormatter();
        FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) file);

        Sheet sheet;
        Row row;
        Cell cell;

        String sheetName, cellValue;
        int cellType, rowIndex = 0, columnIndex = 0;
        boolean blankRow = true, blankArea = true;


        Iterator<Sheet> sheetIt;
        Iterator<Row> rowIt;
        Iterator<Cell> cellIt;

        sheetIt = file.iterator();
        while(sheetIt.hasNext()) {
            sheet = sheetIt.next();
            sheetName = sheet.getSheetName();

            rowIt = sheet.iterator();
            while(rowIt.hasNext()) {
                row = rowIt.next();

                cellIt = row.iterator();
                while (cellIt.hasNext()) {
                    cell = cellIt.next();
                    cellType = cell.getCellType();

                    if(!isBlankCell(cellType) || !blankArea) {
                        if(rowIndex == 0 && columnIndex == 0)
                            data.append(sheetName + " - Header" + ";");
                        else if(rowIndex > 0 && columnIndex == 0)
                            data.append(sheetName + ";");

                        objFormulaEvaluator.evaluateInCell(cell);
                        cellValue = objDefaultFormat.formatCellValue(cell,objFormulaEvaluator);

                        if(cellValue.isEmpty())
                            data.append(";");
                        else
                            data.append(cellValue + ";");

                        columnIndex++;
                        blankRow = false;
                        blankArea = false;
                    }
                }

                if(!blankRow) {
                    data.append('\n');
                    rowIndex++;
                }

                blankRow = true;
                columnIndex = 0;
            }
            //new sheet => reset control fields
            rowIndex = 0;
            columnIndex = 0;
            blankRow = true;
            blankArea = true;
        }

        fos.write(data.toString().getBytes());
        fos.close();
    }

    private static boolean isBlankCell(int cellType) {
        return cellType == Cell.CELL_TYPE_BLANK
                || cellType == Cell.CELL_TYPE_ERROR
                || cellType == Cell.CELL_TYPE_FORMULA;
    }

    public static void main(String[] args) {

        if(args.length < 2 || args.length > 2) {
            System.err.println("Insert input and output path");
            System.exit(0);
        }

        File input = new File(args[0]);
        File output = new File(args[1]);

        try {
            convert(input, output);
            System.out.println("File " + output.getName() + "created sucessfully");

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

【问题讨论】:

  • 你的 Java 文件有包声明吗?
  • Java文件是否编译无误?
  • @Jens 我将用我的程序编辑问题。
  • @Jens,但是是的,编译没有错误。
  • 试试这个java -classpath ".;c:\lib\*" MainClass

标签: java linux apache-poi javac javacompiler


【解决方案1】:

如果您想添加目录,同时包含运行/编译 Java 文件所需的所有 jar,您可以使用以下命令:

在 Windows 中:

java -classpath ".;c:\lib*" MainClass

在 UNIX/Linux 中

java -classpath ".:/lib/*" MainClass

注意:在windows中;(分号)是分隔符,而在UNIX/Linux中:(冒号)是多个jar目录的分隔符

.(点)代表当前目录

【讨论】:

  • 我遇到了问题。如果我不将目录更改为我的 .java 文件所在的文件夹,那么该命令是什么?我之所以问是因为我也编译了该文件,但是当我尝试运行它时出现以下错误:> 错误:无法找到或加载主类 .home.demo.Desktop.xls_to_csv.xlsToCsv。我所做的是:> javac -classpath ".:/home/demo/Desktop/xls_to_csv/jars/*" /home/demo/Desktop/xls_to_csv/xlsToCsv.java。 > java -classpath ".:/home/demo/Desktop/xls_to_csv/jars/*" /home/demo/Desktop/xls_to_csv/xlsToCsv.
  • 您的问题不清楚,我假设您已经在 .java 文件中定义了一些包结构,如果是这样,您将不得不使用带有该包结构的-p 命令。如果不是,则需要到该位置编译您的 .java 文件,否则 javac 或 java 命令如何知道您的 .java 文件在哪里?
  • 我把问题写下来了。它在这里。 stackoverflow.com/questions/35337793/…
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 2014-02-03
  • 2015-02-21
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多