当前位置: 首页 > 知识库问答 >
问题:

使用Maven在IntelliJ IDEA中的GUI应用程序:在内置到jar中后抛出NullPointerException

薛烈
2023-03-14

大约一年前,这里也提出了类似的问题。然而,我发现这个问题缺少一些细节和要点,并且没有给出正确的答案。所以我重新提出同样的问题。

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

<?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>

这有一个绑定到它的类,显示如下。

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最初如下所示。

<?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将其构建到一个胖jar中。然后,问题开始出现。当执行Maven创建的jar时,它抛出一个NullPointerException,如下所示。

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行中有标识符。此标识符绝不是初始化的。因此,它采用默认值null。所以我意识到问题实际上与IDEA有关,我只需要转换<代码>。将IDEA生成的文件格式化为JVM可以单独读取的格式。

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

>

  • 添加了以下依赖项

    <dependency>
        <groupId>com.intellij</groupId>
        <artifactId>forms_rt</artifactId>
        <version>7.0.3</version>
    </dependency>
    

    添加了以下插件

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>ideauidesigner-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>javac2</goal>
                </goals>
            </execution>
        </executions>
    
        <configuration>
            <fork>true</fork>
            <debug>true</debug>
            <failOnError>true</failOnError>
        </configuration>
    </plugin>
    

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

    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表达式。

    以下是我的问题。

    • 我做错什么了吗?
    • 有解决办法吗?
    • 对此有可行的替代方案吗?
  • 共有2个答案

    游安康
    2023-03-14

    第一种可能性:

    frame.setContentPane(panel1);
    

    此处,pane1未初始化,为空。

    第二种可能性:

    String str = txtTest.getText();
    JOptionPane.showMessageDialog(null, str);
    

    您正在将null传递给showMessageDialog(),它需要父组件。

    马天逸
    2023-03-14

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

    <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="TestUI">
    

    我更改了bind-to-class属性以正确包含新包。这篇文章很旧,但它可能会帮助将来的人浏览这里。

     类似资料:
    • 我需要你的帮助,请理解调试一个maven应用程序使用Wildfly和Intellij的想法。 谢谢,

    • 我是Java开发的新手,这里有一个问题:我生成了web应用程序 ,然后我添加了文件夹和简单的文件。通过命令在my localhost:8080/manager中,我可以看到我的web应用程序,但是我如何在其中添加我的jar文件呢?

    • 我有一个带有Yarn的Flink集群,使用flink-quickstart-java原型构建一个演示项目。在使用'mvn clean package-pbuild-jar'命令构建fat-jar之后,并使用'flink run-m yar-cluster-yn2./flink-Snapshot-1.0.jar'提交程序,程序会抛出以下异常: 下面是我的演示: 和一些版本信息: FLink版本:1.

    • 我有一个java应用程序,需要部署在weblogic服务器中。我目前正在为该应用程序制作ear文件。我的ear文件中有一个ejb jar。我想将log4j2 jar添加到此应用程序中。所以我的文件夹结构是 目前,我已经将JAR放在APP-INF文件夹/lib和META-INF/application中。xml我把JAR放在了模块中。这是我的申请表。xml 但它不接受log4j罐子。有什么解决方案吗

    • 我正在尝试为我的所有TextViews/EditViews等设置自定义字体。我遵循这个答案:是否可以为整个应用程序设置自定义字体? 为此,我有一个<code>。ttfassets/font/myFont.ttf中的文件。要将此<code>字体: } 要将其添加到我的文本视图,我只需在布局中执行以下操作: 样式在哪里: 错误 我想我确实错过了一些非常简单的事情。这是LogCat:

    • 我正在尝试将Realm添加到我的应用程序(Xamarin Android)中。首先从模拟器开始(Xaamrin android播放器-Nexus 5和androidLollipop)。 此处为Github问题 我的代码: 我得到的异常: 领域。RealmFileAccessErrorException:Realms.NativeCommon不允许执行操作。ExceptionThrower(IntP