java class getResource 找不到 jar 文件中列出的图标
java class getResource can't find icons listed in jar file
我真的很难过。我只是一个老 C X11/Motif 程序员,想写一个 Java 小程序。经过一周的阅读the Oracle Java Documentation,以及
与 getResource 相关的 Stack Overflow 答案,我仍然无法弄清楚如何检索我的 jar 文件中图标文件的路径。
我的图标包含在我的应用程序的 jar 文件中。我希望使用 jar 文件中的相对位置来访问它们。我假设最好的方法是通过 getResource 方法。
我的程序代码的核心部分称为 Fŭd(发音为食物 - 就像猫在连环画中拼写它一样“ 得到Fuzzy")如下:
package localhost.system1;
imports not shown for brevity.
public class Fud extends JPanel
implements FocusListener, ActionListener, ItemListener
{
private static final long serialVersionUID = 1L;
static Food data = null;
static int prev = 0;
static int next = 1;
static int plus = 2;
static int minus = 3;
public static void main(String args[]) throws Exception
{
LocalDate now = LocalDate.now();
int dateDifference = 0;
// load in the existing data
data = new Food(programName);
data.loadFood(programName);
// test to see if data is up to date. Add days if not
dateDifference = Math.abs((int)ChronoUnit.DAYS.between(now, data.day[0].date));
if ( dateDifference != 0)
{
data.adjustToToday(dateDifference, programName);
}
/////////////////////////////////////////////////
// create the GUI and switch running over to it.
/////////////////////////////////////////////////
Fud fud = new Fud();
Class<? extends Fud> fudClass = fud.getClass();
String className = fudClass.getName();
System.out.println("fudClass getname returns " + className);
URL testURL = fudClass.getResource("prev.png");
System.out.println("fudClass getResource returned " + testURL);
// Create GUI and turn the control over to it
javax.swing.SwingUtilities.invokeLater
(new Runnable()
{
public void run()
{
URL[] iconURL = new URL[4];
iconURL[prev] = Fud.class.getResource("prev.png");
iconURL[next] = Fud.class.getResource("next.png");
iconURL[plus] = Fud.class.getResource("plus.png");
iconURL[minus] = Fud.class.getResource("minus.png");
createAndShowGUI(fud, iconURL);
}
}
);
} // end of main
.
.
.
Rest of methods and subroutines needed
.
.
.
}
当运行时,代码returns结果如下:
fudClass getname returns localhost.system1.Fud
fudClass getResource returned null
这让我很沮丧。无论我尝试什么(我已经尝试了很多事情),结果都是一样的。对于 getResource 方法的响应,我一直得到 NULL。当我使用 jar -tf Fud.jar
查询 jar 文件时,我得到以下信息:
jar tf Fud.jar
META-INF/MANIFEST.MF
localhost/
localhost/system1/
localhost/system1/Day.class
localhost/system1/Food.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
minus.png
next.png
plus.png
prev.png
所以图标在 Jar 文件中。 谁能告诉我我做错了什么? 在 Eclipse 中,我的项目浏览器看起来像:eclipse Project Explorer
我将图像目录添加到我的项目 Java 在 eclipse 中构建如下: Eclipse Java Build
我使用 Eclipse 版本构建程序:2021-12 (4.22.0) 构建 ID:20211202-1639。此外,我在 Windows 11 Pro build 22000.434.
上使用 Java 17.0.1 2021-10-19 LTS
您必须在资源前添加斜线:
Fud.class.getResource("/prev.png");
否则 java 在 class 所在的同一文件夹中搜索,
所以它将在 localhost/system1
中搜索
我真的很难过。我只是一个老 C X11/Motif 程序员,想写一个 Java 小程序。经过一周的阅读the Oracle Java Documentation,以及 与 getResource 相关的 Stack Overflow 答案,我仍然无法弄清楚如何检索我的 jar 文件中图标文件的路径。
我的图标包含在我的应用程序的 jar 文件中。我希望使用 jar 文件中的相对位置来访问它们。我假设最好的方法是通过 getResource 方法。
我的程序代码的核心部分称为 Fŭd(发音为食物 - 就像猫在连环画中拼写它一样“ 得到Fuzzy")如下:
package localhost.system1;
imports not shown for brevity.
public class Fud extends JPanel
implements FocusListener, ActionListener, ItemListener
{
private static final long serialVersionUID = 1L;
static Food data = null;
static int prev = 0;
static int next = 1;
static int plus = 2;
static int minus = 3;
public static void main(String args[]) throws Exception
{
LocalDate now = LocalDate.now();
int dateDifference = 0;
// load in the existing data
data = new Food(programName);
data.loadFood(programName);
// test to see if data is up to date. Add days if not
dateDifference = Math.abs((int)ChronoUnit.DAYS.between(now, data.day[0].date));
if ( dateDifference != 0)
{
data.adjustToToday(dateDifference, programName);
}
/////////////////////////////////////////////////
// create the GUI and switch running over to it.
/////////////////////////////////////////////////
Fud fud = new Fud();
Class<? extends Fud> fudClass = fud.getClass();
String className = fudClass.getName();
System.out.println("fudClass getname returns " + className);
URL testURL = fudClass.getResource("prev.png");
System.out.println("fudClass getResource returned " + testURL);
// Create GUI and turn the control over to it
javax.swing.SwingUtilities.invokeLater
(new Runnable()
{
public void run()
{
URL[] iconURL = new URL[4];
iconURL[prev] = Fud.class.getResource("prev.png");
iconURL[next] = Fud.class.getResource("next.png");
iconURL[plus] = Fud.class.getResource("plus.png");
iconURL[minus] = Fud.class.getResource("minus.png");
createAndShowGUI(fud, iconURL);
}
}
);
} // end of main
.
.
.
Rest of methods and subroutines needed
.
.
.
}
当运行时,代码returns结果如下:
fudClass getname returns localhost.system1.Fud
fudClass getResource returned null
这让我很沮丧。无论我尝试什么(我已经尝试了很多事情),结果都是一样的。对于 getResource 方法的响应,我一直得到 NULL。当我使用 jar -tf Fud.jar
查询 jar 文件时,我得到以下信息:
jar tf Fud.jar
META-INF/MANIFEST.MF
localhost/
localhost/system1/
localhost/system1/Day.class
localhost/system1/Food.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
localhost/system1/Fud.class
minus.png
next.png
plus.png
prev.png
所以图标在 Jar 文件中。 谁能告诉我我做错了什么? 在 Eclipse 中,我的项目浏览器看起来像:eclipse Project Explorer
我将图像目录添加到我的项目 Java 在 eclipse 中构建如下: Eclipse Java Build
我使用 Eclipse 版本构建程序:2021-12 (4.22.0) 构建 ID:20211202-1639。此外,我在 Windows 11 Pro build 22000.434.
上使用 Java 17.0.1 2021-10-19 LTS您必须在资源前添加斜线:
Fud.class.getResource("/prev.png");
否则 java 在 class 所在的同一文件夹中搜索,
所以它将在 localhost/system1