You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by en...@apache.org on 2020/10/21 12:21:43 UTC

[netbeans] branch delivery updated: Read mainClass configuration or property.

This is an automated email from the ASF dual-hosted git repository.

entl pushed a commit to branch delivery
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/delivery by this push:
     new 3b2dabe  Read mainClass configuration or property.
     new 832de2c  Merge pull request #2474 from entlicher/MavenMainClass_delivery
3b2dabe is described below

commit 3b2dabe6baf7154533b4183b0b44fd423ab04066
Author: Martin Entlicher <ma...@oracle.com>
AuthorDate: Tue Oct 20 15:58:58 2020 +0200

    Read mainClass configuration or property.
---
 .../modules/maven/runjar/RunJarPrereqChecker.java  |  60 ++++++++-
 .../maven/runjar/RunJarPrereqCheckerTest.java      | 134 +++++++++++++++++++++
 2 files changed, 193 insertions(+), 1 deletion(-)

diff --git a/java/maven/src/org/netbeans/modules/maven/runjar/RunJarPrereqChecker.java b/java/maven/src/org/netbeans/modules/maven/runjar/RunJarPrereqChecker.java
index 26b6196..b3f3b2c 100644
--- a/java/maven/src/org/netbeans/modules/maven/runjar/RunJarPrereqChecker.java
+++ b/java/maven/src/org/netbeans/modules/maven/runjar/RunJarPrereqChecker.java
@@ -24,9 +24,13 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Properties;
 import javax.swing.JButton;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Plugin;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
 import org.netbeans.api.java.project.JavaProjectConstants;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectUtils;
@@ -57,6 +61,8 @@ import org.openide.util.NbBundle.Messages;
 @ProjectServiceProvider(service=PrerequisitesChecker.class, projectType="org-netbeans-modules-maven/" + NbMavenProject.TYPE_JAR)
 public class RunJarPrereqChecker implements PrerequisitesChecker {
 
+    private static final String[] MAIN_CLASS_PROPERTIES = {"mainClass", "exec.mainClass", "project.mainClass", "project.mainclass"}; // NOI18N
+
     private String mainClass;
 
     @Override public boolean checkRunConfig(RunConfig config) {
@@ -82,7 +88,7 @@ public class RunJarPrereqChecker implements PrerequisitesChecker {
         if ((ActionProvider.COMMAND_RUN.equals(actionName) ||
                 ActionProvider.COMMAND_DEBUG.equals(actionName) ||
                 ActionProvider.COMMAND_PROFILE.equals(actionName))) {
-            String mc = null;
+            String mc = findMainClass(config);
             for (Map.Entry<? extends String,? extends String> entry : config.getProperties().entrySet()) {
                 if (entry.getValue().contains("${packageClassName}")) { //NOI18N
                     //show dialog to choose main class.
@@ -99,6 +105,58 @@ public class RunJarPrereqChecker implements PrerequisitesChecker {
         return true;
     }
 
+    private static String findMainClass(RunConfig config) {
+        // Read main class from the manifest property:
+        String mainClass = getConfiguration(config, "maven-jar-plugin", "archive", "manifest", "mainClass"); // NOI18N
+        if (mainClass != null) {
+            return mainClass;
+        }
+        // Read main class from exec-maven-plugin configuration:
+        mainClass = getConfiguration(config, "exec-maven-plugin", "mainClass"); // NOI18N
+        if (mainClass != null) {
+            return mainClass;
+        }
+        // Check pom's properties:
+        Properties properties = config.getMavenProject().getProperties();
+        for (String name : MAIN_CLASS_PROPERTIES) {
+            String mc = properties.getProperty(name);
+            if (mc != null) {
+                return mc;
+            }
+        }
+        return null;
+    }
+
+    private static Plugin findPlugin(RunConfig config, String name) {
+        List<Plugin> plugins = config.getMavenProject().getBuild().getPlugins();
+        for (Plugin p : plugins) {
+            if (name.equals(p.getArtifactId())) {
+                return p;
+            }
+        }
+        return null;
+    }
+
+    private static String getConfiguration(RunConfig config, String pluginId, String... configs) {
+        Plugin plugin = findPlugin(config, pluginId);
+        if (plugin != null) {
+            Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration();
+            if (configuration != null) {
+                Xpp3Dom child = configuration;
+                for (String c : configs) {
+                    child = child.getChild(c);
+                    if (child == null) {
+                        break;
+                    }
+                }
+                if (child != null) {
+                    return child.getValue();
+                }
+            }
+        }
+        return null;
+    }
+
     @Messages({
         "LBL_ChooseMainClass_Title=Select Main Class for Execution",
         "LBL_ChooseMainClass_OK=Select Main Class"
diff --git a/java/maven/test/unit/src/org/netbeans/modules/maven/runjar/RunJarPrereqCheckerTest.java b/java/maven/test/unit/src/org/netbeans/modules/maven/runjar/RunJarPrereqCheckerTest.java
index a05f78e..9f4eafc 100644
--- a/java/maven/test/unit/src/org/netbeans/modules/maven/runjar/RunJarPrereqCheckerTest.java
+++ b/java/maven/test/unit/src/org/netbeans/modules/maven/runjar/RunJarPrereqCheckerTest.java
@@ -19,13 +19,19 @@
 
 package org.netbeans.modules.maven.runjar;
 
+import java.io.IOException;
 import java.io.StringReader;
+import java.util.Collections;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.junit.NbTestCase;
+import org.netbeans.modules.maven.NbMavenProjectImpl;
+import org.netbeans.modules.maven.api.execute.RunConfig;
 import org.netbeans.modules.maven.configurations.M2ConfigProvider;
+import org.netbeans.modules.maven.execute.ActionToGoalUtils;
 import org.netbeans.modules.maven.execute.model.ActionToGoalMapping;
 import org.netbeans.modules.maven.execute.model.io.xpp3.NetbeansBuildActionXpp3Reader;
+import org.netbeans.spi.project.ActionProvider;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.filesystems.test.TestFileUtils;
@@ -63,4 +69,132 @@ public class RunJarPrereqCheckerTest extends NbTestCase {
         assertEquals(1, mapping.getActions().size());
     }
 
+    public void testMainClassManifest() throws Exception {
+        TestFileUtils.writeFile(d, "pom.xml",
+                "<project>\n" +
+                "    <modelVersion>4.0.0</modelVersion>\n" +
+                "    <groupId>testgrp</groupId>\n" +
+                "    <artifactId>testart</artifactId>\n" +
+                "    <version>1.0</version>\n" +
+                "    <build>\n" +
+                "        <plugins>\n" +
+                "            <plugin>\n" +
+                "                <groupId>org.apache.maven.plugins</groupId>\n" +
+                "                <artifactId>maven-jar-plugin</artifactId>\n" +
+                "                <configuration>\n" +
+                "                    <archive>\n" +
+                "                        <manifest>\n" +
+                "                            <mainClass>com.mycompany.Main2</mainClass>\n" +
+                "                        </manifest>\n" +
+                "                    </archive>\n" +
+                "                </configuration>\n" +
+                "            </plugin>\n" +
+                "        </plugins>\n" +
+                "    </build>" +
+                "</project>\n");
+        checkMainClass("com.mycompany.Main2");
+    }
+
+    public void testMainClassManifestProperty() throws Exception {
+        TestFileUtils.writeFile(d, "pom.xml",
+                "<project>\n" +
+                "    <modelVersion>4.0.0</modelVersion>\n" +
+                "    <groupId>testgrp</groupId>\n" +
+                "    <artifactId>testart</artifactId>\n" +
+                "    <version>1.0</version>\n" +
+                "    <properties>\n" +
+                "        <clazz>com.mycompany.Main1</clazz>\n" +
+                "    </properties>\n" +
+                "    <build>\n" +
+                "        <plugins>\n" +
+                "            <plugin>\n" +
+                "                <groupId>org.apache.maven.plugins</groupId>\n" +
+                "                <artifactId>maven-jar-plugin</artifactId>\n" +
+                "                <configuration>\n" +
+                "                    <archive>\n" +
+                "                        <manifest>\n" +
+                "                            <mainClass>${clazz}</mainClass>\n" +
+                "                        </manifest>\n" +
+                "                    </archive>\n" +
+                "                </configuration>\n" +
+                "            </plugin>\n" +
+                "        </plugins>\n" +
+                "    </build>" +
+                "</project>\n");
+        checkMainClass("com.mycompany.Main1");
+    }
+
+    public void testMainClassExecConfig() throws Exception {
+        TestFileUtils.writeFile(d, "pom.xml",
+                "<project>\n" +
+                "    <modelVersion>4.0.0</modelVersion>\n" +
+                "    <groupId>testgrp</groupId>\n" +
+                "    <artifactId>testart</artifactId>\n" +
+                "    <version>1.0</version>\n" +
+                "    <build>\n" +
+                "        <plugins>\n" +
+                "            <plugin>\n" +
+                "                <groupId>org.codehaus.mojo</groupId>\n" +
+                "                <artifactId>exec-maven-plugin</artifactId>\n" +
+                "                <configuration>\n" +
+                "                    <mainClass>com.example.Main2</mainClass>\n" +
+                "                </configuration>\n" +
+                "            </plugin>\n" +
+                "        </plugins>\n" +
+                "    </build>" +
+                "</project>\n");
+        checkMainClass("com.example.Main2");
+    }
+
+    public void testMainClassExecProperty1() throws Exception {
+        TestFileUtils.writeFile(d, "pom.xml",
+                "<project>\n" +
+                "    <modelVersion>4.0.0</modelVersion>\n" +
+                "    <groupId>testgrp</groupId>\n" +
+                "    <artifactId>testart</artifactId>\n" +
+                "    <version>1.0</version>\n" +
+                "    <properties>\n" +
+                "        <mainClass>org.demo.Main2</mainClass>\n" +
+                "    </properties>\n" +
+                "</project>\n");
+        checkMainClass("org.demo.Main2");
+    }
+
+    public void testMainClassExecProperty2() throws Exception {
+        TestFileUtils.writeFile(d, "pom.xml",
+                "<project>\n" +
+                "    <modelVersion>4.0.0</modelVersion>\n" +
+                "    <groupId>testgrp</groupId>\n" +
+                "    <artifactId>testart</artifactId>\n" +
+                "    <version>1.0</version>\n" +
+                "    <properties>\n" +
+                "        <exec.mainClass>org.demo.Main2</exec.mainClass>\n" +
+                "        <exec.java.bin>${java.home}/bin/java</exec.java.bin>\n" +
+                "    </properties>\n" +
+                "</project>\n");
+        checkMainClass("org.demo.Main2");
+    }
+
+    public void testMainClassExecProperty3() throws Exception {
+        TestFileUtils.writeFile(d, "pom.xml",
+                "<project>\n" +
+                "    <modelVersion>4.0.0</modelVersion>\n" +
+                "    <groupId>testgrp</groupId>\n" +
+                "    <artifactId>testart</artifactId>\n" +
+                "    <version>1.0</version>\n" +
+                "    <properties>\n" +
+                "        <project.mainclass>org.demo.Main2</project.mainclass>\n" +
+                "        <exec.java.bin>${java.home}/bin/java</exec.java.bin>\n" +
+                "    </properties>\n" +
+                "</project>\n");
+        checkMainClass("org.demo.Main2");
+    }
+
+    private void checkMainClass(String mainClass) throws IOException {
+        Project proj = ProjectManager.getDefault().findProject(d);
+        RunConfig rc = ActionToGoalUtils.createRunConfig(ActionProvider.COMMAND_RUN, proj.getLookup().lookup(NbMavenProjectImpl.class), proj.getLookup());
+        rc.addProperties(Collections.singletonMap("testMainClass", "${packageClassName}"));
+        new RunJarPrereqChecker().checkRunConfig(rc);
+        assertEquals(mainClass, rc.getProperties().get("testMainClass"));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists