Java 导出使用相对路径的 JAR
Java Export JAR that use relative paths
我正在尝试将我的项目导出为 运行nable 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
方法总是 return 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_package_name
是 class 对象(即 getClass()
)的包名称,其中 '/'
代替 '.'
。
你也可以使用Class#getResourceAsStream()
which returns an InputStream
,然后转换为字节数组并传递给ImageIcon
构造函数:
InputStream input = getClass().getResourceAsStream("/logo.png");
byte[] bytes = IOUtils.toByteArray(input); // using commons-io library
panel.add(new JLabel(new ImageIcon(bytes)));
我正在尝试将我的项目导出为 运行nable 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
方法总是 return 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_package_name
是 class 对象(即 getClass()
)的包名称,其中 '/'
代替 '.'
。
你也可以使用Class#getResourceAsStream()
which returns an InputStream
,然后转换为字节数组并传递给ImageIcon
构造函数:
InputStream input = getClass().getResourceAsStream("/logo.png");
byte[] bytes = IOUtils.toByteArray(input); // using commons-io library
panel.add(new JLabel(new ImageIcon(bytes)));