【问题标题】:Java Export JAR that use relative paths使用相对路径的 Java 导出 JAR
【发布时间】:2015-09-14 23:17:39
【问题描述】:

我正在尝试将我的项目导出为可运行的 jar。无论如何,我都可以使用 Eclipse 功能或 Maven 来完成。

我的程序正在使用一些亲戚路径来加载资源(图像)。我从项目基目录指定 eclipse 中的路径。使用 Eclipse 执行我的程序时一切正常,但是当我生成一个 jar 并尝试运行它时,什么也没有,它立即退出。我认为我的程序从 jar 执行时无法访问我的资源。

我有以下树状:

src/main/java/nantel/java/boulder/views/MainWindow.java
src/main/resources/logo.png

我正在使用以下内容来加载我的图片:

panel.add(new JLabel(new ImageIcon("./src/main/resources/logo.png")));

正如我所说,当我从 Eclipse 启动它时可以,但不能从可执行 jar 启动... 我认为这是类路径的问题。

我已尝试改用以下内容:

panel.add(new JLabel(new ImageIcon(getClass().getResource("logo.png"))));

我尝试了不同的路径,但我总是得到一个NullPointerExceptiongetResource 方法总是返回 null)。

您知道如何使用getClass().getResource() 方法获取资源,以及它是否有助于我运行可执行的 jar?

我也给你我的 maven 构建配置..

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>nantel.java.boulder.Launcher</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

当我提取 JAR 存档时,我可以看到树状结构与我的 Eclipse 项目中的不同。不再有 src/main/resources 或 src/main/java 而是直接把所有的东西都写成:

./logo.png
./nantel/java/boulder/...

我的应用程序在给定的相对路径(“./src/main/resources/logo.png”)中找不到资源,这似乎是逻辑上的。有什么想法吗?

----- 编辑

NullPointerException 已经在 Eclipse 启动中得到解决,但是我在尝试执行 jar 时仍然出现错误。

hiveship:Desktop Maelig$ java -jar test.jar 
@@@ default folder path -> file:/Users/Maelig/Desktop/test.jar!/levels/
Exception in thread "main" java.lang.NullPointerException

为什么是这样的路径? 在我的代码中:

    public static final String DEFAULT_FOLDER_PATH = SpriteRepository.class.getResource("/levels/").getPath();

【问题讨论】:

  • 您是否尝试过从这些类路径中删除前导 .
  • 是的,如果我没有指定 './' 我的资源不会加载到 Eclipse 中(而不是在可执行 jar 中)。
  • @MaëligNANTEL:希望这个关于如何add images to java Project 的帖子将有助于您的努力:-)

标签: java eclipse maven jar


【解决方案1】:

尝试在路径前添加前导/

panel.add(new JLabel(new ImageIcon(getClass().getResource("/logo.png"))));

如果您不输入正斜杠,则给定资源的绝对名称将是:

modified_package_name/resource_name 

其中modified_package_name 是类对象的包名(即getClass()),其中'/' 代替了'.'

您也可以使用Class#getResourceAsStream(),它返回一个InputStream,然后转换为字节数组并将其传递给ImageIcon 构造函数:

InputStream input = getClass().getResourceAsStream("/logo.png");
byte[] bytes = IOUtils.toByteArray(input);  // using commons-io library
panel.add(new JLabel(new ImageIcon(bytes)));

【讨论】:

  • 谢谢,它解决了我从 Eclipse 执行我的应用程序时的 NullPointerException !但是我仍然无法从可执行 jar 启动我的应用程序:(
  • @MaëligNANTEL 路径是Jar文件中文件的URL。您还可以使用getResourceAsStream 返回InputStream 而不是URL。请参阅我的更新答案。
  • @manouti 嗨,关于输出,我有不同的情况。在 Eclipse 中运行时,ClassLoader.getResource(subdir/readme.txt) 和 Class.getResource(/subdir/readme.txt) 都给了我成功。但是当从 Windows 机器上的可执行 jar 运行时,它们都返回 NULL。我在这里缺少什么吗?
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2017-06-22
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多