方案一:
项目右键 ========== run as ============ maven install
会在项目target目录下生成一个jar包
jar 包的内部结构
这个jar 包执行总是报错,一开始提示没有设置main class,手动修改META-INF 下的 MANIFEST.MF ,加入
Main-Class: com.zzg.mybatis.generator.MainUI
Class-Path: .
再执行还是报错,提示
Caused by: java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
接下来看方案二,方案二虽然也不能执行,但是找到了出错的问题,修改后能够正常执行
方案二:
项目右键 ================= export ================= runnable jar file
选择 jar 启动时执行哪个类中的 main 方法 、导出的目录 、依赖的 jar 包打包的方式
第一个Extract required libraries into generated JAR
意思是将依赖的jar解压出来变成class丢进你生成的jar里面;
第二个Package required libraries into generated JAR
意思是将依赖的jar不解压,直接放进你生成的jar里面;
第三个Copy required libraries into a sub-folder next to the generated JAR
意思是将依赖的jar放到你生成jar的同级目录下的”xxx_lib”文件夹里面。
这里我选的第一个(第一个和第二个都亲测可用,第三个应该也是可以的,只是没有去测试)
第一种 jar 包的内部结构
注意看这里的 resources 目录,它里面的东西并没有直接放在根目录,导致类似下面的代码获取到的 url 都是 null
URL url = Thread.currentThread().getContextClassLoader().getResource("fxml/MainUI.fxml");
只需要把 resources 里的文件都拷贝到根目录即可
到此 jar 包已经可以正常执行
使用过程中又遇到了已下问题:
问题1:
于是把lib包又给拷出去了
问题2:
点击【代码生成】,查看生成的文件是ANSI格式的,不能直接放到项目中使用,否则会中文乱码
但是之前在编辑器中直接 run as Java application的时候生成的文件是UTF-8格式的
解决方案有两个
一:在写文件时指定文件格式
BufferedReader reader; BufferedWriter writer; //reader = new BufferedReader(new FileReader(new File(filedir,filename))); reader = new BufferedReader( new InputStreamReader( new FileInputStream( new File(filedir,filename)), "UTF-8" )); //writer = new BufferedWriter(new FileWriter(new File(filedir,emailDomain+".txt"),true)); writer = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( new File(filedir,emailDomain+ ".txt" ), true ), "UTF-8" ));
二:运行jar包时指定jar包的编码格式
java -jar -Dfile.encoding=utf-8 gui2.jar
问题3:
首次进入界面连接之前保存过的数据库,提示连接失败
[ERROR] [18:31:15.352] [JavaFX Application Thread] [] com.zzg.mybatis.generator.controller.MainUIController.lambda$3:163 --> No suitable driver found for jdbc:mysql://localhost:3306/project01?useUnicode=true&useSSL=false&characterEncoding=utf8 java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/project01?useUnicode=true&useSSL=false&characterEncoding=utf8 at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.8.0_281] at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.8.0_281] at com.zzg.mybatis.generator.util.DbUtil.getTableNames(DbUtil.java:34) ~[gui2.jar:na]
但是参数什么的都没有错,用相同的参数再去创建连接,是可以创建成功的,创建成功后再去双击打开之前保存的连接,发现又不报错了 ,肯定是缺少了初始化什么东西了,对比一下两个连接数据库的方法,发现直接双击打开保存过的连接少了三行代码,加上以后就没再报错了
但是我还是有个疑惑没有解开,为什么打成jar包执行才会有这个问题?之前直接跑main方法是没有这个问题的,之前又是在哪里做了这个?为什么打成jar包后没有去执行那里的代码,流程难道不是一样的吗?