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' 文件位于其他项目的资源上。我该如何解决?
您可能已将 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。
因此,我已将 git 存储库添加到我的项目 (sjxlsx)。然后我右键单击了 repo 并导入到包资源管理器中。然后我转到项目->构建路径以确保它在 "Required projects on the build path".
上当我在 Eclipse 上调试时,工作正常。
我现在正尝试导出为 运行 jar,当我在 Eclipse 之外执行它时,它以某种方式给出错误(empty.xlsx 未找到)。也就是说,因为在 XLSXWriterSupport 中,打开方法正在获取此 empty.xlsx 文件。在调试时,它按预期工作,但在转换为 运行 jar 时,它给了我这个错误。
这是因为此 'empty.xlsx' 文件位于其他项目的资源上。我该如何解决?
您可能已将 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。