【问题标题】:Bash script run jar with external files included does not work包含外部文件的 Bash 脚本运行 jar 不起作用
【发布时间】:2015-04-01 18:13:32
【问题描述】:

我有一个要从 bash 脚本启动的 jar 文件。此 jar 包含对包含图像的外部文件夹的引用。

当我使用 jar 的绝对路径从命令行运行 jar 时,一切正常。当我从 bash 脚本运行它时会出现问题。显然找不到包含图像的文件夹。

从命令行启动:

java -Djava.library.path=/opt/opencv/build/lib -Xmx1g -jar /home/version4/Podo.jar

Bash 脚本:

#! /bin/bash -x
cmd="java -Djava.library.path=/opt/opencv/build/lib -Xmx1g -jar /home/version4/Podo.jar"
eval $cmd

我的图片所在的目录是: /home/version4/img

用于访问图像的 Java 代码:

 String img_header="./img/HEADER.png";
 String img_body="./img/BODY.png";
 BufferedImage header,body;
 header=ImageIO.read(new File(img_header));
 body=ImageIO.read(new File(img_body));

输出错误:

   javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(ImageIO.java:1301)

谁能告诉我我做错了什么?谢谢。

【问题讨论】:

  • 为什么你在这里使用eval 而不仅仅是运行命令?
  • 即使我只运行命令也是一样的;我第一次这样做,比我读到我最好使用 eval :|
  • 好的,那么你用-x 运行你的脚本,它应该会输出运行命令。那么输出是什么?
  • 如何检索图像?向我们展示代码。
  • 图片的目录是什么?应用程序将其称为绝对路径还是相对路径?

标签: java linux bash jar


【解决方案1】:

您应该从运行 jar 文件的同一目录中运行 bash 脚本。不过,它可以位于另一个地方,唯一的意义细节是你的工作目录。更好的方法是将图像存储在 jar 中,请参阅 Getting a BufferedImage as a resource so it will work in JAR file

在任何情况下,您都不应该使用绝对路径来检索图像,因为这种解决方案只会破坏 jar 的任何可移植性。

【讨论】:

  • 谢谢!问题是我无法存储罐子里面的东西,因为它们会被用户不时更换,并且必须完成更新图像的过程。所以用户必须有权访问这些图像...
  • 然后你可以使用一些用户可以更改的设置。
  • 是的,就像我的图像路径所在的 XML 文件。
【解决方案2】:

如果您从 jar 位置以外的位置运行 bash 脚本,请尝试提供图像的绝对路径(在您的 java 代码中)。

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2013-06-08
    • 1970-01-01
    • 2013-08-08
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多