我正在开发一个基于Gradle的Java Swing应用程序,并且我还使用了IntelliJ GUI Form内置的Swing设计器。我决定测试Gradle创建的可执行jar是否正常工作,并且构建的应用程序看不到IntelliJ设计器创建的Swing组件。
我尝试了来自Intellij Idea 13 UI Designer and automatic Gradle building的建议,但jar仍然看不到那些Swing组件。我正在使用IntelliJ Idea 2019.2。我已经从IntelliJ lib文件夹中复制了“ forms_rt.jar”,并将其链接到build.gradle文件中。 我还将设置中的IntelliJ GUI生成设置为Java代码,而不是二进制代码。
我在项目中创建了一个“ lib”目录,并在其中复制了“ forms_rt” jar,并将其重命名为“ forms_rt-13.1.1.jar”。 (虽然我认为应该是19.2,但出于测试目的,我没有更改版本号)
repositories {
mavenCentral()
flatDir dirs: "${rootDir}/lib"
}
jar {
manifest {
attributes 'Main-Class': 'aghwen.Main'
}
}
dependencies {
compile name: 'forms_rt', version: '13.1.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
compile group: 'org.json', name: 'json', version: '20180813'
compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1'
}
我也将jar添加到依赖项中,以便可以正确链接。
在Build, Execution, Deployment -> Build tools -> Gradle
的IntelliJ设置中,将“使用以下语言进行构建和运行”和“使用...运行测试”设置为IntelliJ IDEA,否则将不会生成Java代码,而是生成二进制代码。
在测试了我在Stack和JetBrains论坛上发现的所有建议之后,我仍然无法使其正常运行。
"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" -Dfile.encoding=windows-1252 -jar C:\Projects\Java\aghwen\build\libs\aghwen-5.0.jar
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/intellij/uiDesigner/core/GridLayoutManager
at aghwen.ChoiceWindowForm.$$$setupUI$$$(ChoiceWindowForm.java:57)
at aghwen.ChoiceWindowForm.<init>(ChoiceWindowForm.java:45)
at aghwen.Main.lambda$main$0(Main.java:8)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.ClassNotFoundException: com.intellij.uiDesigner.core.GridLayoutManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 17 more
该jar没有或看不到生成的Swing GUI并引发错误。有趣的是,如果我从build.gradle中删除'flatDir dirs:“ $ {rootDir} / lib”'和'compile name:'forms_rt',version:'13 .1.1'行,则jar将不会创建为Gradle没有看到GUI组件。这意味着Gradle知道表单库可以理解它,但是它不以某种方式在创建的jar中链接它。
我在这里找到了答案:intellij build jar artifact containing gradle dependencies 看起来我的jar中没有运行创建的Swing组件所需的forms_rt.jar,并且从上面的链接复制的“ fatJar”任务使它一切正常。