因为SpringBoot生成的Jar包应用内置了Tomcat服务器,所以我们在Windows系统下希望可以通过直接运行.exe程序来启动应用。
当然这就需要使用exe4J来对Jar包进行封装。

但是封装成功之后运行缺通常会产生如下的错误:

java.lang.NoClassDefFoundError: BOOT-INF/classes/com/example/DemoApplication (wrong name: com/example/DemoApplication)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:59)
at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:101)

这是因为我们在用exe4J封装时,选择的main类往往是我们应用的启动类,就是带有@SpringBootApplication的那个。

但是实际上真正的启动类应该是org.springframework.boot.loader.JarLauncher。所以才会产生上面那样的错误。

所以解决办法很简单,就是在使用exe4J封装SpringBoot时,main类选择org.springframework.boot.loader.JarLauncher就好了。