首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IntelliJ IDEA中的GUI应用程序使用Maven:将NullPointerException构建到jar中

IntelliJ IDEA中的GUI应用程序使用Maven:将NullPointerException构建到jar中
EN

Stack Overflow用户
提问于 2016-12-29 05:54:45
回答 3查看 1.6K关注 0票数 4

一个类似的问题已经在一年前被这里问到了。不过,我发觉这问题有一些遗漏的细节和要点,而且没有适当的答案。所以我也要重新抚养孩子。

我在IntelliJ IDEA中创建了一个Maven项目,并在其中添加了一个GUI表单。默认情况下,IDEA为表单的结构创建一个单独的XML文件。我的报告如下。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="TestUI">
  <grid id="27dc6" binding="panel1" default-binding="true" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
    <margin top="0" left="0" bottom="0" right="0"/>
    <constraints>
      <xy x="20" y="20" width="500" height="400"/>
    </constraints>
    <properties/>
    <border type="none"/>
    <children>
      <component id="e40aa" class="javax.swing.JTextField" binding="txtTest">
        <constraints>
          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
            <preferred-size width="150" height="-1"/>
          </grid>
        </constraints>
        <properties/>
      </component>
    </children>
  </grid>
</form>

它有一个类绑定到它,如下所示。

代码语言:javascript
复制
import javax.swing.*;

public class TestUI {
    private JTextField txtTest;
    private JPanel panel1;

    public TestUI() {
        String str = txtTest.getText();
        JOptionPane.showMessageDialog(null, str);
        createAndShowGui();

        txtTest.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Clicked");
            }
        });
    }

    private  void createAndShowGui(){
        JFrame frame = new JFrame("test");
        frame.setContentPane(panel1);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        TestUI obj = new TestUI();
    }
}

这个项目的POM.xml最初看起来如下所示。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.company.test</groupId>
    <artifactId>UITestWithIJ</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>TestUI</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

当这个想法运行的时候,它就完美无缺了。因此,我使用组装插件通过Maven将其构建到一个胖罐子中。然后问题就开始跳出来了。当执行Maven创建的jar时,它抛出一个NullPointerException,如下所示。

代码语言:javascript
复制
user@group-PC09:~/.m2/repository/com/company/test/UITestWithIJ/1.0-SNAPSHOT$ java -jar UITestWithIJ-1.0-SNAPSHOT-jar-with-dependencies.jar 
Exception in thread "main" java.lang.NullPointerException
    at TestUI.<init>(TestUI.java:13)
    at TestUI.main(TestUI.java:34)

更深入地研究,我发现造成这种情况的原因是第13行,其中包含txtTest标识符。不初始化此标识符。因此,它采用默认值null。因此,我意识到问题实际上与IDEA有关,我只需要将IDEA生成的.form文件转换成仅由JVM可以读取的某种格式。

通过研究,我可以找到一个候选的解决方案这里。根据其中的说明,我修改了我的POM.xml如下。

  • 添加了以下依赖项 com.intellij forms_rt 7.0.3
  • 添加了以下插件 org.codehaus.mojo ideauidesigner-maven-plugin javac2真真

这解决了这个问题。但是,在TestUI.java中可以看到添加了一个事件侦听器。这可以用Java 8 forth中的lambda表达式代替。一旦完成了替换,Maven就无法构建jar,引发以下错误。

代码语言:javascript
复制
user@group-PC09:~/IdeaProjects/UITestWithIJ$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.company.test:UITestWithIJ:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.codehaus.mojo:ideauidesigner-maven-plugin is missing. @ line 53, column 21
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building UITestWithIJ 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ UITestWithIJ ---
[INFO] Deleting /home/user/IdeaProjects/UITestWithIJ/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ UITestWithIJ ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.6.0:compile (default-compile) @ UITestWithIJ ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /home/user/IdeaProjects/UITestWithIJ/target/classes
[INFO] 
[INFO] --- ideauidesigner-maven-plugin:1.0-beta-1:javac2 (default) @ UITestWithIJ ---
[INFO] Executing IDEA UI Designer task...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.227 s
[INFO] Finished at: 2016-12-29T11:11:43+05:30
[INFO] Final Memory: 17M/205M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 (default) on project UITestWithIJ: Execution default of goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 failed: 52264 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

我已经退出了-X开关,并发现这里实际上失败的是插件ideauidesigner-maven-plugin的maven目标javac2,唯一可能的原因是lambda表达式。插件中的一个方法抛出了一个ArrayIndexOutOfBoundsException,我已经检查了它和Maven存储库中的依赖项forms_rt,我注意到它们最后一次更新是在2009年和2010年。可能是插件无法处理lambda表达式。

以下是我的问题。

  • 我做错了什么吗?
  • 有解决办法吗?
  • 是否有可行的替代方案?
EN

回答 3

Stack Overflow用户

发布于 2020-05-09 04:13:07

当我使用IntelliJ将我的项目转换为maven项目时,我遇到了这个问题。此过程自动创建包文件夹并将src文件放入其中。所以我把这个包添加到我所有文件的顶部。但是,当我的JFrame以前正常工作时,这造成了完全相同的错误。在表单文件中,在XML中,绑定是错误的,因为我现在使用的是包。

代码语言:javascript
复制
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="TestUI">

我更改了bind-to-class属性以正确地包含新包。这篇文章是旧的,但它可能会对将来的人有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2022-09-22 00:49:50

你的候选解决方案对我没用。

经过研究,只有当我们使用maven编译时才会发生这种情况。如果我们使用Intellij进行编译,一切都会很好。所以我唯一的解决方案就是在打包的时候做这个步骤。

  1. 使用Maven进行清理,以确保每个已编译的类都已清除
  2. 使用内置Intellij构建
  3. 使用Maven的软件包
票数 0
EN

Stack Overflow用户

发布于 2016-12-29 06:23:14

第一种可能性:

代码语言:javascript
复制
frame.setContentPane(panel1);

在这里,pane1不是初始化的,而是空的。

第二种可能性:

代码语言:javascript
复制
String str = txtTest.getText();
JOptionPane.showMessageDialog(null, str);

您正在将null传递给showMessageDialog(),它在那里期望父Component

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41373882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档