简体   繁体   English

IntelliJ GUI Designer Maven 可执行 JAR 导出

[英]IntelliJ GUI Designer Maven Executable JAR Export

I'm using IntelliJ IDEA 's GUI designer and Maven as build system.我使用IntelliJ IDEA的 GUI 设计器和Maven作为构建系统。 When I build the executable JAR file via this answer, the build succeeds.当我通过答案构建可执行JAR文件时,构建成功。 However, it throws an exception when launched via the command java -jar MyApplication.jar :但是,它在通过命令java -jar MyApplication.jar启动时会引发异常:

    Exception in thread "main" java.awt.IllegalComponentStateException: contentPane cannot be set to null.
            at javax.swing.JRootPane.setContentPane(JRootPane.java:621)
            at javax.swing.JFrame.setContentPane(JFrame.java:698)
...

The affected code line is the following:受影响的代码行如下:

setContentPane(panel);

When ran from source in IntelliJ , it works fine however Maven doesn't seem to properly build the JAR file.IntelliJ中的源代码运行时,它可以正常工作,但是Maven似乎无法正确构建JAR文件。 After all, IntelliJ does "magic" by linking to a .form file for keeping .java source code files clean from GUI code.毕竟,IntelliJ 通过链接到.form文件来保持.java源代码文件不受 GUI 代码影响,从而实现了“魔法”。

I also found a possible solution which involves adding a special plugin to the pom.xml file that seems to enable build support for IntelliJ 's GUI designer here .我还找到了一个可能的解决方案,它涉及在pom.xml文件中添加一个特殊插件,该插件似乎可以在此处启用对IntelliJ的 GUI 设计器的构建支持。 So I ran mvn clean compile assembly:single again, it didn't have any errors however nothing changed.所以我再次运行mvn clean compile assembly:single ,它没有任何错误但是没有任何改变。

If I do a mvn deploy , the plugin throws the following error:如果我执行mvn deploy ,插件会抛出以下错误:

[ERROR] Failed to execute goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 (default) on project MyApplication: Execution default of goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 failed: 16257 -> [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

Here is my pom.xml:这是我的 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>groupId</groupId>
    <artifactId>MyApplication</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- Apache Commons Lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

        <!-- Jsoup HTML parser -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.8.3</version>
        </dependency>

        <!-- Apache Commons IO -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- Apache Commons Validator -->
        <dependency>
            <groupId>commons-validator</groupId>
            <artifactId>commons-validator</artifactId>
            <version>1.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.example.MyApplication
                            </mainClass>
                        </manifest>
                        <manifestEntries>
                            <Built-By>BullyWiiPlaza</Built-By>
                        </manifestEntries>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

            <!-- IDEA Gui Designer Plugin -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>ideauidesigner-maven-plugin</artifactId>
                <version>1.0-beta-1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>javac2</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>
                    <fork>true</fork>
                    <debug>true</debug>
                    <failOnError>true</failOnError>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

What is wrong?怎么了? How do I properly export an executable JAR file using Maven in combination with IntelliJ 's GUI designer?如何使用Maven结合IntelliJ的 GUI 设计器正确导出可执行JAR文件?

That happens because Maven doesn't really know how to compile GUI created with IntelliJ GUI Designer.发生这种情况是因为 Maven 并不真正知道如何编译使用 IntelliJ GUI Designer 创建的 GUI。 That's why you have to explicitly instruct IntelliJ to generate all the code it understands and Maven doesn't.这就是为什么您必须明确指示 IntelliJ 生成它可以理解的所有代码而 Maven 不能。

To do this go to GUI Designer settings and change the Generate GUI into value to Java Source files .为此,请转到GUI Designer设置并将Generate GUI into value 更改为Java Source files From now on IntelliJ will include all the code responsible for setting UI up in the class itself and all the external tools, like Maven, Eclipse will work properly.从现在开始,IntelliJ 将包括所有负责在类本身中设置 UI 的代码,以及所有外部工具,如 Maven,Eclipse 将正常工作。

I had the same problem using IntelliJ IDEA 2017.1.5 but I was able to get it working with Maven .我在使用IntelliJ IDEA 2017.1.5时遇到了同样的问题,但我能够让它与Maven一起使用。 I created a GitHub repository with the updated plugin source code here .我在这里使用更新的插件源代码创建了一个GitHub存储库。

First, clone the project.首先,克隆项目。

In the ideauidesigner-maven-plugin-master folder, run the install-intellij-libs.sh script to install the IntelliJ libraries into your local maven repository:ideauidesigner-maven-plugin-master文件夹中,运行install-intellij-libs.sh脚本将IntelliJ库安装到本地 maven 存储库中:

./install-intellij-libs.sh <path to your IntelliJ directory>

Here is also a batch file ( install-intellij-libs.bat ) for Windows:这里还有一个适用于 Windows 的批处理文件 ( install-intellij-libs.bat ):

SET INTELLIJ_HOME=C:\Program Files\JetBrains\IntelliJ IDEA 173.3188.16 REM Edit this to match your path!
CALL mvn install:install-file -Dfile="%INTELLIJ_HOME%\lib\javac2.jar" -DgroupId=com.intellij -DartifactId=javac2 -Dversion=17.1.5 -Dpackaging=jar
CALL mvn install:install-file -Dfile="%INTELLIJ_HOME%\lib\asm-all.jar" -DgroupId=com.intellij -DartifactId=asm-all -Dversion=17.1.5 -Dpackaging=jar
CALL mvn install:install-file -Dfile="%INTELLIJ_HOME%\lib\forms_rt.jar" -DgroupId=com.intellij -DartifactId=forms_rt -Dversion=17.1.5 -Dpackaging=jar

Then install your new plugin by running the following:然后通过运行以下命令安装新插件:

mvn install

Now you're done with setting up your environment.现在您已经完成了环境的设置。

In your actual project, edit the plugin's version in your pom.xml to this:在您的实际项目中,将pom.xml中的插件版本编辑为:

<version>1.0-beta-2-17.1.5</version>

Also add the following dependencies:还要添加以下依赖项:

 <dependency>
  <groupId>com.intellij</groupId>
  <artifactId>javac2</artifactId>
  <version>LATEST</version>
</dependency>
<dependency>
  <groupId>com.intellij</groupId>
  <artifactId>forms_rt</artifactId>
  <version>LATEST</version>
</dependency>
<dependency>
  <groupId>com.intellij</groupId>
  <artifactId>asm-all</artifactId>
  <version>LATEST</version>
</dependency>

Now building should work correctly with UI designer forms.现在构建应该与 UI 设计器表单一起正常工作。

I had the same problem but I think I found a much easier solution:我有同样的问题,但我想我找到了一个更简单的解决方案:

  1. In IntelliJ go into File -> Settings -> Editor -> GUI Designer and do the following setting:在 IntelliJ 中进入File -> Settings -> Editor -> GUI Designer并执行以下设置:

    • Generate UI into: Java source code生成 UI 成:Java 源代码
    • Enable Automatically copy form runtime classes...启用Automatically copy form runtime classes...
  2. Add the following dependncy into yout maven pom.xml :将以下依赖项添加到 yout maven pom.xml中:

     <dependency> <groupId>com.intellij</groupId> <artifactId>forms_rt</artifactId> <version>7.0.3</version> </dependency>
  3. Additionally add to your pom.xml an assembly plugin snippet which could look like this example:此外,在您的pom.xml中添加一个程序集插件片段,如下所示:

     <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <finalName>testUiClient</finalName> <appendAssemblyId>false</appendAssemblyId> <archive> <manifest> <mainClass> my.personal.MainClass </mainClass> </manifest> <manifestEntries> <Multi-Release>true</Multi-Release> <Class-Path>.</Class-Path> </manifestEntries> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </execution> </executions> </plugin> </plugins> </build>

That should do it - it works at least for me.应该这样做 - 它至少对我有用。 Just let me know if it works also for you :-)让我知道它是否也适合你:-)

The answer by @jorichard may be simplifed and made CI friendly - so no local installation of any IDE is required and all configuration and dependency management is done by Maven. @jorichard的回答可能会被简化并使 CI 友好——因此不需要本地安装任何 IDE,所有配置和依赖项管理都由 Maven 完成。

The plugin org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1 has 2 dependencies on the code provided by Jetbrains via com.intellij:javac2:7.0.3 and com.intellij:forms_rt:7.0.3 (both last updated in 2008).插件org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1对 Jetbrains 通过com.intellij:javac2:7.0.3com.intellij:forms_rt:7.0.3提供的代码有两个依赖项(两者都是最后更新于 2008 年)。 These have not been directly updated since, but have modern equivalents hosted by Jetbrains in their own repositories .从那以后,这些都没有直接更新,但在他们自己的存储库中拥有由 Jetbrains 托管的现代等价物。

All there is to be done is to overwrite the plugin dependencies.要做的就是覆盖插件依赖项。 In this configuration (which is working for me) I updated to jetbrains libraries in version 212.5284.40 , or latest at the time of writing, corresponding to Intellij IDEA 2021.2.2.在此配置中(对我有用),我更新到版本212.5284.40的 jetbrains 库,或在撰写本文时最新版本,对应于 Intellij IDEA 2021.2.2。

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>ideauidesigner-maven-plugin</artifactId>
            <version>1.0-beta-1</version>
            <dependencies>
                <dependency>
                    <groupId>com.jetbrains.intellij.java</groupId>
                    <artifactId>java-compiler-ant-tasks</artifactId>
                    <version>212.5284.40</version>
                </dependency>
                <dependency>
                    <groupId>com.jetbrains.intellij.java</groupId>
                    <artifactId>java-gui-forms-rt</artifactId>
                    <version>212.5284.40</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <goals>
                        <goal>javac2</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <fork>true</fork>
                <debug>true</debug>
                <failOnError>true</failOnError>
            </configuration>
        </plugin>
    </plugins>
</build>

<pluginRepositories>
    <pluginRepository>
        <id>intellij-repository</id>
        <url>https://www.jetbrains.com/intellij-repository/releases</url>
    </pluginRepository>
    <pluginRepository>
        <id>intellij-third-party</id>
        <url>https://cache-redirector.jetbrains.com/intellij-dependencies</url>
    </pluginRepository>
</pluginRepositories>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM