Java导出运行带有项目的jar

时间:2018-07-23 16:52:57

标签: java eclipse export-to-excel xlsx

因此,我已经在项目(sjxlsx)中添加了一个git repo。然后,我右键单击该存储库,并将其导入到包资源管理器中。然后,我转到Project-> Build path,以确保它位于“ build path上的必需项目”上。

当我在Eclipse上调试时,一切正常。

我现在正试图导出为正在运行的jar,当我在Eclipse之外执行它时,它某种程度上给出了错误(找不到empty.xlsx)。也就是说,因为在XLSXWriterSupport中,open方法正在获取此empty.xlsx文件。在调试时,它可以按预期工作,但在转换为正在运行的jar时,会出现此错误。

这是由于此“ empty.xlsx”文件位于另一个项目的资源上。我该怎么解决?

  

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

2 个答案:

答案 0 :(得分:1)

这是因为类路径上的资源不是文件系统上的 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

答案 1 :(得分:0)

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

编辑:

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

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

(假设您的主类是com.example.Main) 为了运行您的可运行jar文件,请将lib1和lib2与您的可运行jar放在同一目录中并运行:

java -jar myJar.jar

否则,您可以只编译主类并像这样运行它(假设将lib1和lib2复制到主类根路径上的lib / dir中):

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

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

希望这会有所帮助。