java - 在 Maven 项目中使用 Apache POI 运行 .jar 文件

标签 java excel apache maven apache-poi

我正在努力运行一个使用 Apache POI 创建 Excel 文档的简单程序。这也是我第一次接触 Maven 项目,所以可能与此有关:

我的 pom.xml 看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>calendar</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>calendar</name>
  <url>http://maven.apache.org</url>

    <dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>

    <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>3.10-FINAL</version>
    </dependency>


    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.10-FINAL</version>
    </dependency>

  </dependencies>
</project>

据我所知,我的依赖关系没有问题。

这是我的 java 代码,我跳过了 import 语句,但它们都在那里,据我所知,此代码中没有错误:

public class App 
{

    private static final String FILE_NAME = "/tmp/MyFirstExcel.xlsx";

    public static void main( String[] args ) throws IOException
    {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Datatypes in Java");

        Object[][] datatypes = {
            {"Datatype", "Type", "Size(in bytes)"},
            {"int", "Primitive", 2},
            {"float", "Primitive", 4},
            {"double", "Primitive", 8},
            {"char", "Primitive", 1},
            {"String", "Non-Primitive", "No fixed size"}    
        };

        int rowNum = 0;
        System.out.println("Creating excel");
        for(Object[] datatype : datatypes) {
            Row row = sheet.createRow(rowNum++);
            int colNum = 0;
            for(Object field : datatype) {
                Cell cell = row.createCell(colNum++);
                if(field instanceof String) {
                    cell.setCellValue((String) field);
                }
                else if(field instanceof Integer) {
                    cell.setCellValue((Integer) field);
                }
            }
        }

        try {
            FileOutputStream outputStream = new FileOutputStream(FILE_NAME);
            workbook.write(outputStream);
            //workbook.close()
        } catch (FileNotFoundException e) {
            System.out.println("Couldn't find file to write out to");
        } catch (IOException e) {
            System.out.println("IO Exception in printing");
        }

    }
}

我已将 workbook.close() 注释掉,因为这会导致错误(已弃用的方法?)。

使用源文件夹中的上述代码,我可以运行 mvn package ,它会成功构建并在目标中生成 .jar 文件 calendar-1.0-SNAPSHOT.jar文件夹。

我正在尝试使用运行此文件

java -cp target/calendar-1.0-SNAPSHOT.jar com.mycompany.app.App

...我收到以下错误消息

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Workbook
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 7 more

如果这个问题需要更多信息,请告诉我。我在这里不知所措。

最佳答案

您需要使用 Maven Assembly Plugin 创建一个 fat/uber jar。这意味着将 Jar 及其依赖项 Jars 创建为单个可执行 Jar 文件。当您运行它时,它将拥有所有可用的依赖项。

在 POM 中添加以下插件

<build>
    <plugins>
        <!-- Maven Assembly Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>com.your.path.to.main.App</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                                    <!-- bind to the packaging phase -->
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

    </plugins>
</build>

运行以下命令:

mvn package

将在目标文件夹中创建两个 jar 文件。

calendar-1.0-SNAPSHOT.jar – Only your project classes
calendar-1.0-SNAPSHOT-with-dependencies.jar – Project and dependency classes in a single jar.

您可以按照以下方式运行它;

java -cp target/calendar-1.0-SNAPSHOT-with-dependencies.jarcom.mycompany.app.App

您可以查看calendar-1.0-SNAPSHOT-with-dependency.jar的内容

jar tf target/calendar-1.0-SNAPSHOT-with-dependencies.jar

关于java - 在 Maven 项目中使用 Apache POI 运行 .jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149152/

相关文章:

python - 为数据框Python列中的每个唯一值创建Excel工作表

Excel公式在相同间隔后显示特定单元格中的值

java - 苹果 jdbc 网络服务器

java - 给定网格的一些节点,查找飞机在网格上的位置

java - 处理从批处理文件运行 Java 时出现的错误

vba - 如何在 Excel 中通过 VBA 在筛选/可见单元格中复制/粘贴公式

PHP5.3(作为Apache模块)无法写入/var/www/<project-name>/<document-root>/cache

php - android 你没有权限访问/在此服务器上 WAMP

java - 需要帮助理解一些行约束行为

java - Android 在每次方向改变时都会创建额外的 ListFragment