3 ways to run Java main from Maven
2012-10-28 16:39
344 查看
3 ways to run Java main from Maven
OverviewMaven exec plugin lets you run the main method of a Java class in your project, with the project dependencies automatically included in the classpath. This article show you 3 ways of using the maven exec plugin to run java, with code examples.
1) Running from Command line
Since you are not running your code in a maven phase, you first need to compile the code. Remember exec:java does not automatically compile your code, you need to do that first.mvn compile
Once your code is compiled, the following command runs your class
Without arguments:
view plaincopyto clipboardprint?
mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main"
With arguments:
view plaincopyto clipboardprint?
mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main" -Dexec.args="arg0 arg1 arg2"
With runtime dependencies in the CLASSPATH:
view plaincopyto clipboardprint?
mvn exec:java -Dexec.mainClass="com.vineetmanohar.module.Main" -Dexec.classpathScope=runtime
2) Running in a phase in pom.xml
You can also run the main method in a maven phase. For example, you can run the CodeGenerator.main() methodas part of thetest phase.view plaincopy
to clipboardprint?
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.vineetmanohar.module.CodeGenerator</mainClass>
<arguments>
<argument>arg0</argument>
<argument>arg1</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
To run the exec plugin with above configuration, simply run the corresponding phase.
mvn test
3) Running in a profile in pom.xml
You can also run the main method in a different profile. Simply wrap the above config in the <profile> tag.view plaincopy
to clipboardprint?
<profiles>
<profile>
<id>code-generator</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.vineetmanohar.module.CodeGenerator</mainClass>
<arguments>
<argument>arg0</argument>
<argument>arg1</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
To call the above profile, run the following command:
mvn test -Pcode-generator
Advanced options:
You can get a list of all available parameters by typing:view plaincopy
to clipboardprint?
mvn exec:help -Ddetail=true -Dgoal=java
arguments (exec.arguments)
The class arguments.
classpathScope (exec.classpathScope, Default: compile)
Defines the scope of the classpath passed to the plugin. Set to compile, test, runtime or system depending on your needs
cleanupDaemonThreads (exec.cleanupDaemonThreads)
Wether to interrupt/join and possibly stop the daemon threads upon quitting. If this is false, maven does nothing about the daemon threads. When maven has no more work to do, the VM will normally terminate any remaining daemon threads. In certain cases (in particular if maven is embedded), you might need to keep this enabled to make sure threads are properly cleaned up to ensure they don't interfere with subsequent activity. In that case, see daemonThreadJoinTimeout and stopUnresponsiveDaemonThreads for further tuning.
commandlineArgs (exec.args)
Arguments for the executed program
daemonThreadJoinTimeout (exec.daemonThreadJoinTimeout, Default: 15000)
This defines the number of milliseconds to wait for daemon threads to quit following their interruption. This is only taken into account if cleanupDaemonThreads is true. A value <=0 means to not timeout (i.e. wait indefinitely for threads to finish). Following a timeout, a warning will be logged. Note: properly coded threads should terminate upon interruption but some threads may prove problematic: as the VM does interrupt daemon threads, some code may not have been written to handle interruption properly. For example java.util.Timer is known to not handle interruptions in JDK <= 1.6. So it is not possible for us to infinitely wait by default otherwise maven could hang. A sensible default value has been chosen, but this default value may change in the future based on user feedback.
executableDependency
If provided the ExecutableDependency identifies which of the plugin dependencies contains the executable class. This will have the affect of only including plugin dependencies required by the identified ExecutableDependency. If includeProjectDependencies is set to true, all of the project dependencies will be included on the executable's classpath. Whether a particular project dependency is a dependency of the identified ExecutableDependency will be irrelevant to its inclusion in the classpath.
includePluginDependencies (exec.includePluginDependencies, Default: false)
Indicates if this plugin's dependencies should be used when executing the main class. This is useful when project dependencies are not appropriate. Using only the plugin dependencies can be particularly useful when the project is not a java project. For example a mvn project using the csharp plugins only expects to see dotnet libraries as dependencies.
includeProjectDependencies (exec.includeProjectDependencies, Default: true)
Indicates if the project dependencies should be used when executing the main class.
mainClass (exec.mainClass)
The main class to execute.
sourceRoot (sourceRoot)
This folder is added to the list of those folders containing source to be compiled. Use this if your plugin generates source code.
stopUnresponsiveDaemonThreads (exec.stopUnresponsiveDaemonThreads)
Wether to call Thread.stop() following a timing out of waiting for an interrupted thread to finish. This is only taken into account if cleanupDaemonThreads is true and the daemonThreadJoinTimeout threshold has been reached for an uncooperative thread. If this is false, or if Thread.stop() fails to get the thread to stop, then a warning is logged and Maven will continue on while the affected threads (and related objects in memory) linger on. Consider setting this to true if you are invoking problematic code that you can't fix. An example is Timer which doesn't respond to interruption. To have Timer fixed, vote for this bug.
systemProperties
A list of system properties to be passed. Note: as the execution is not forked, some system properties required by the JVM cannot be passed here. Use MAVEN_OPTS or the exec:exec instead. See the user guide for more information.
testSourceRoot (testSourceRoot)
This folder is added to the list of those folders containing source to be compiled for testing. Use this if your plugin generates test source code.
FAQ and Errors
Why do I get this error when specifying arguments to my main method:
view plaincopyto clipboardprint?
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to configure plugin parameters for: org.codehaus.mojo:exec-maven-plugin:1.1.1
on the command line, specify: '-Dexec.arguments=VALUE'
Cause: Cannot assign configuration entry 'arguments' to 'class [Ljava.lang.String;' from '${exec.arguments}',
which is of type class java.lang.String
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Error configuring: org.codehaus.mojo:exec-maven-plugin.
Reason: Unable to parse the created DOM for plugin configuration
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:588)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:513)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:483)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:331)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:292)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:142)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:336)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:129)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:301)
Solution
exec.arguments was used before version 1.1 of the exec plugin, it did not support conversion of command line String to String[] array.
If possible upgrade to 1.1 or later and use exec.args instead of exec.arguments.
If you can't upgrade the plugin version, you can still use command line arguments with a profile and use multiple <argument> tags associated in the pom.xml
相关文章推荐
- 3 ways to run Java main from Maven
- 3 ways to run Java main from Maven
- 3 ways to run Java main from Maven
- 【Maven】在Maven中运行java main函数的方法(3 ways to run Java main from Maven)
- How to run Java main class and pass application arguments in Maven?
- JAVA学习:maven开发环境快速搭建How to download J2EE API (javaee.jar) from Maven
- A wrapper for maven to run with specific JAVA_HOME
- log4j的1.2.15版本,在pom.xml中的顶层project报错错误: Failure to transfer javax.jms:jms:jar:1.1 from https://maven-repository.dev.java.net/nonav/repository......
- Maven: Maven Antrun Plugin configuration to copy package from target to basedir and rename it
- Caused by: java.lang.IllegalStateException: Unable to find a single main class from问题解决
- maven编译生成的jar包运行出现 "Failed to load Main-Class manifest attribute from"
- jar 打包java class文件后,运行jar 出现 Failed to load Main-Class manifest attribute from 错误
- Maven使用tomcat7-maven-plugin插件run时出现错误: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
- Maven使用package打包Spring Boot时出现:Unable to find a single main class from the following candidates的问题解决
- Gradle task to run java main class
- com.sun.tools.javac.Main is not on the classpath.Perhaps JAVA_HOME does not point to the JDK
- maven web项目不能创建src/main/java等文件夹的问题
- 使用maven运行Java Main的三种方法解析
- 7.9 Async 异步操作 - Start/ToAsync/StartFuture/FromAction/FromCallable/RunAsync
- Description Resource Path Location Type web.xml is missing and <failOnMissingWebXml> is set to true pom.xml /Ascend line 7 Maven Java EE Configuration Problem