本来IDE里面运行正常的项目,打包成jar后经常访问不到文件,现记录解决方法。
project目录结构:
TestPro\
bin
lib
src\
com.folmarcher\ \\包名
Test.java
files\
logo.icon
那么,因为所有的类都在同一个包名下,就都可以使用绝对路径来访问logo.icon,例如这样的路径:
String icon= “\files\logo. png”;
//顺便说一下,JFrame设置左上角icon,好像只能用png格式图片,.icon格式是不行的,
路径前面的“/”表明使用绝对路径,即当前类的顶级package的同级目录,即这里的src/目录下,但是,这样还不行,程序里面还要使用 getResource() 方法,来访问文件。
- Test.java
package com.folmarcher;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Test extends JFrame {
String icon = "/files/logo.png";
public static void main(String[]args){
Test t = new Test();
t.launch();
}
public void launch(){
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
//Test.class得到Test类的目录,然后再访问就没有问题了
//或者用,this.getClass().getResource();也行
//但是注意这两种方法得到的都只是 “当前” 类Test或对象t的目录,
this.setIconImage(ImageIO.read(Test.class.getResource(icon)));
} catch(Exception e){
e.printStackTrace();
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,200);
setVisible(true);
}
}
这样路径就没问题了,运行如图,左上角图标修改成功
接下来就是在ItellijIDEA里面打成jar包。
进入project structure,如下操作
然后,给jar包命名,然后点击+号,点击module output 添加项目,这里为TestPro
- 点+号,选择Extracted Directory添加项目依赖的jar包,另说一下,这个jar包我放在lib/目录下面的,然后在module setting里面添加到了依赖目录里面了,外部jar包只要放在这里就能使用,添加方法如下:
点了加号后,选择JARs or directories,然后选择TestPro项目里面的lib目录,然后选择类型当然是jar Directory
完了lib目录就会出现在 dependencies中,记得要勾选lib哦
- 好了,继续打包我们的jar,,,项目添加了,依赖的jar包也添加了,那个files目录不用添加,会自动打包进去。然后就是选择好main class,选择放置manifest file的目录,这都不用说。
- 说一下这个classpath:
这是配置依赖的jar包的路径使用的,目测像之前设置好依赖目录 lib 之后,选择完jar包 这里会自动填好。所以我还没用到。。。 - 然后就是 build ,选择Build Artifacts,rebuild,这就完了啊,然后就去out目录里面找生成的jar包就行了,
- jar包生成了记进去看看目录结构有没有错,我们这里正确的应该是:
test.jar/
com.folmarcher/
Test.class
files/
logo.png
META-INF/
menifest.mf
ps: 虽然这样做基本没错过,但是有时候还是会出岔子,建议把项目的编译class删除,重新编译,生成的jar包也删除,重新build,然后基本能解决,再不然,俺也就没辙了。。。。