使用相对路径的 Java Export JAR

标签 java eclipse maven jar

我正在尝试将我的项目导出为可运行的 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"))));

我尝试了不同的路径,但我总是得到一个NullPointerException(getResource 方法总是返回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 launch 中解决了,但是我在尝试执行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();

最佳答案

尝试在路径前添加一个前导/:

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

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

modified_package_name/resource_name 

其中 modified_pa​​ckage_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)));

关于使用相对路径的 Java Export JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099657/

相关文章:

java - 处理警告 : "The expression of type x is boxed into x" 的正确方法是什么

java - Maven 加密属性

maven - IntelliJ 使用哪个版本的 Maven,我如何找出

java - 单击第二个按钮时的操作

java - Maven 多模块项目生命周期

java - 如何消除代码味道: getSessionFactory,仅在必要时创建SessionFactory

java - 为什么 Key Listener 仅有时起作用

java - 如果在 boolean 值上有其他功能

java - 使用 JDBC 批量插入带有外键的多个表

eclipse - 强制 Eclipse 在每次运行前自动清理项目