Proyecto Maven Run

231

¿Existe una "fase" u "objetivo" de Maven para ejecutar simplemente el método principal de una clase Java? Tengo un proyecto que me gustaría probar manualmente simplemente haciendo algo como "mvn run".

Verhogen
fuente

Respuestas:

348

Vea el complemento exec maven . Puede ejecutar clases Java usando:

mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...

La invocación puede ser tan simple como mvn exec:javasi la configuración del complemento está en su pom.xml. El sitio del complemento en Mojohaus tiene un ejemplo más detallado .

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>com.example.Main</mainClass>
                    <arguments>
                        <argument>argument1</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Robert Munteanu
fuente
14
¡Así es como debería verse una respuesta! referencia + ejemplo simple + ejemplo complejo. el simple ejemplo me sirvió (no se necesita más configuración)
codewing
1
¿Hay una versión más nueva de este complemento (más reciente que 1.2.1?)
Alexander Mills
Sí, hay una versión más nueva, así que no copie el fragmento anterior de 1 a 1 a menos que quiera usar la versión 1.2.1. Consulte mojohaus.org/exec-maven-plugin/usage.html para obtener la última versión. es 1.6.0
user1053510
Gracias, ¿también sabría cómo ejecutar una clase principal si está en un submódulo con dependencias en otros módulos?
user1767316
Esto no ejecuta realmente la clase principal
Dexter
23

1. Editar POM.xml

Agregue la siguiente propiedad en pom.xml. Asegúrese de utilizar el nombre de clase completo (es decir, con el nombre del paquete) que contiene el mainmétodo:

<properties>
        <exec.mainClass>fully-qualified-class-name</exec.mainClass>
</properties>

2. Ejecutar comando

Ahora desde la terminal, active el siguiente comando:

mvn clean compile exec:java

NOTA Puede pasar más argumentos a través de la -Dexec.args="xxx"bandera.

Saikat
fuente
¿Esto realmente funciona? Lo intenté como ambos: <exec.mainClass> $ {foo.bar.SomeMainClass} </ exec.mainClass> y <exec.mainClass> foo.bar.SomeMainClass </exec.mainClass> y no funciona . El error es el mismo: [ERROR] Error al ejecutar el objetivo org.codehaus.mojo: exec-maven-plugin: 1.6.0: java (default-cli) en el proyecto newtrex: Los parámetros 'mainClass' para el objetivo org.codehaus.mojo : exec-maven-plugin: 1.6.0: java falta o no es válido -> [Ayuda 1]
Nenad Bulatovic
Funciona, es posible que desee consultar esta publicación
Saikat
@NenadBulatovic: Funciona si sustituye $ {foo.bar.SomeMainClass} con foo.bar.SomeMainClass -> sin $ o {}
Krishna Santosh Sampath
14

Las respuestas mencionadas anteriormente son correctas, pero lo estoy simplificando para novatos como yo. Vaya al archivo pom de su proyecto. Agregue una nueva propiedad exec.mainClassy dé su valor como la clase que contiene su método principal. Para mí fue DriverClassen mainpkg. Cámbielo según su proyecto. ingrese la descripción de la imagen aquí

Una vez hecho esto, navegue a la carpeta que contiene su proyecto pom.xmly ejecútelo en el símbolo del sistema mvn exec:java. Esto debería llamar al método principal.

shshnk
fuente
8

No es necesario agregar un nuevo complemento en pom.xml. Solo ejecuta este comando

mvn org.codehaus.mojo:exec-maven-plugin:1.5.0:java -Dexec.mainClass="com.example.Main" | grep -Ev '(^\[|Download\w+:)' 

Vea el plugin de Maven Exec para más uso.

arulraj.net
fuente
Pase más argumentos vía-Dexec.args="...arg..."
sstn
2

clean package exec:java -P Class_Containing_Main_Method El comando también es una opción si solo tiene un método Main (PSVM) en el proyecto, con la siguiente configuración de Maven.

No olvide mencionar la clase en la <properties></properties>sección de pom.xml:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.main.class>com.test.service.MainTester</java.main.class>
</properties>

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <configuration>
           <mainClass>${java.main.class}</mainClass>
        </configuration>
</plugin>

Configuración de ejecución de STS junto con la configuración de Maven anterior:

ingrese la descripción de la imagen aquí

Abhijeet
fuente
Eso no me parece bien. ¿No es -P para 'perfil'? Si lo especifica en la línea de comando, ¿por qué necesita ponerlo en las propiedades del complemento?
Rup
@Rup Sí, -Pes para el perfil. Compartió esto, ya que también es una opción para ejecutar el proyecto Maven.
Abhijeet