问题描述
我在 Netbeans 中有一个 Maven 项目。 运行它会显示一个 GUI,您可以在其中使用 JFileChooser 选择和读取文件。 文件选择器具有 getSelectedFiles() 方法,该方法返回一个 File[],然后我将其输入 fileProccesing(File[] files) 以使用来自 Apache pdfBox 依赖项的 PDDocument.load(file) 读取它们。 经过调试,得出以下结论。 在 Netbeans 中运行时,它工作正常,但当它作为 jar 可执行文件运行时,它会在 PDDocument.load(file) 命令处停止。但是不会抛出 IOException。 Ether JFileChooser getSelectedFiles() 返回一些异常类型的文件,或者我的 pom.xml 在某些方面有问题。你可以在下面看到我的 pom.xml。
<?xml version="1.0" encoding="UTF-8"?>
4.0.0
<groupId>application</groupId>
<artifactId>toolToManagePdfs</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>toolToManagePdfs</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.pdfBox</groupId>
<artifactId>pdfBox</artifactId>
<version>2.0.22</version>
</dependency>
<dependency>
<groupId>org.apache.opennlp</groupId>
<artifactId>opennlp-tools</artifactId>
<version>1.9.3</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle,see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle,jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>
application.App
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
解决方法
普通 JAR 在运行时不包含或引用其依赖项。如果你想运行一个 JAR,你需要
- 使用 maven assembly 插件或 maven shade 插件构建一个可执行 JAR。
- 在运行 JAR 时明确列出类路径。
这是我用来在 lib 子目录中保存 jar 文件的内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>application.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
,
问题源于 a = np.random.randint(600,1200,size=len(df))
b = np.random.randint(1500,2000,size=len(df))
df['size'] = np.where(df['type'].eq('yes'),a,b)
中的所有插件。
此外,配置不完整,没有包含 jar 中的依赖项。使用 maven-assembly-plugin 解决了这个问题。
<pluginManagement></pluginManagement>