Java 导出 运行 带有项目的 jar

Java export running jar w/ project

因此,我已将 git 存储库添加到我的项目 (sjxlsx)。然后我右键单击了 repo 并导入到包资源管理器中。然后我转到项目->构建路径以确保它在 "Required projects on the build path".

当我在 Eclipse 上调试时,工作正常。

我现在正尝试导出为 运行 jar,当我在 Eclipse 之外执行它时,它以某种方式给出错误(empty.xlsx 未找到)。也就是说,因为在 XLSXWriterSupport 中,打开方法正在获取此 empty.xlsx 文件。在调试时,它按预期工作,但在转换为 运行 jar 时,它给了我这个错误。

这是因为此 'empty.xlsx' 文件位于其他项目的资源上。我该如何解决?

https://github.com/davidpelfree/sjxlsx/blob/master/src/main/java/com/incesoft/tools/excel/support/XLSXWriterSupport.java

您可能已将 Eclipse 项目构建路径配置为使用绝对库引用。当您尝试 运行 您的 运行nable jar 时,jvm 找不到所需的依赖项。

编辑:

如果您想将软件导出为 RUNNABLE jar 文件,则该 jar 必须包含一个 MANIFEST 文件,其中指定了依赖项和主要 class。示例:

Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: lib1.jar lib2.jar

(假设你的主要 class 是 com.example.Main) 为了 运行 你的 运行nable jar 文件,将 lib1 和 lib2 放在与你的 运行nable jar 和 运行:

相同的目录中
java -jar myJar.jar

否则你可以像这样编译你的主 class 和 运行 (假设 lib1 和 lib2 被复制到你的主 class 根路径上的 lib/ 目录):

java -cp '.:/libs/*.jar' com.example.Main

您还可以使用诸如 maven 之类的依赖项管理器工具并配置您的构建以创建 "uberJar":https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html uberJars 将所有软件依赖项包含在一个沉重的 运行nable jar 文件中。

希望这对您有所帮助。

这是因为 class 路径上的 resource not File 在文件系统上。 这里它被打包在一个罐子里(zip 格式)。

错误代码:

if (getClass().getResource("/empty.xlsx") == null) {
        throw new IllegalStateException("no empty.xlsx found in classpath");
    }
    workbook = new SimpleXLSXWorkbook(new File(getClass().getResource("/empty.xlsx").getFile()));

由于 SimpleXLSXWorkbook 只有一个文件构造器(AFAIK),您需要创建一个临时文件。

Path tempPath = Files.createTempFile("sjxlsx-", ".xlsx");
Files.copy(getClass().getResourceAsStream("/empty.xlsx"), tempPath);
workbook = new SimpleXLSXWorkbook(tempPath.toFile());

最好有一些删除临时文件的规定,例如在特定目录中创建它们,请参阅 Files