如何通过maven运行java文件?

问题描述:

如何通过maven执行SampleFlowTest.java如何通过maven运行java文件?

里面的代码SampleFlowTest.java是:

package com.myname.module.test; 

import com.myname.partA.something; 
import java.util.Scanner; 
import java.util.ArrayList; 

public class SampleFlowTest { 
    public static void main(String[] args) { 
     // something I want to execute 
    } 
} 

文件树如下所示。

. 
├── pom.xml 
├── resource 
│   ├── fileA.txt 
│   └── fileB.txt 
├── src 
│   ├── main 
│   │   └── java 
│   │    └── com 
│   │     └── myname 
│   │      ├── partA 
│   │      │   └── Aaa.java 
│   │      ├── partB 
│   │      │   ├── B.java 
│   │      │   ├── Bb.java 
│   │      │   └── Bbb.java 
│   │      └── module 
│   │       ├── M1.java 
│   │       └── M2.java 
│   └── test 
│    └── java 
│     └── com 
│      └── myname 
│       ├── partA 
│       │   └── test 
│       │    └── AaaTest.java 
│       ├── partC 
│       │   └── service 
│       │    └── test 
│       │     ├── BTest.java 
│       │     └── BbbTest.java 
│       └── module 
│        └── test 
│         └── SampleFlowTest.java 
└── target 
    ├── classes 
    │   ├── com 
    │   │   └── myname 
    │   │    ├── partA 
    │   │    │   └── Aaa.class 
    │   │    ├── partB 
    │   │    │   ├── B.class 
    │   │    │   ├── Bb.class 
    │   │    │   └── Bbb.class 
    │   │    └── module 
    │   │     ├── M1.class 
    │   │     └── M2.class 
    │   └── somefile.txt 
    └── test-classes 
     ├── com 
     │   └── myname 
     │    ├── partA 
     │    │   └── test 
     │    │    └── AaaTest.class 
     │    ├── partC 
     │    │   └── service 
     │    │    └── test 
     │    │     ├── BTest.class 
     │    │     └── BbbTest.class 
     │    └── module 
     │     └── test 
     │      └── SampleFlowTest.class 
     └── module.properties 

我试过了,就像Maven: How to run a .java file from command line passing arguments说过,但它仍然不起作用。

我执行mvn exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest,并发生错误,结果的一部分是:

[WARNING] 
java.lang.ClassNotFoundException: com.myname.module.test.SampleFlowTest 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:281) 
    at java.lang.Thread.run(Thread.java:745) 

应该比我执行mvn exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest其他什么命令?

+0

我认为'mvn exec'不会查看你的测试类路径。为什么你的测试类是'main'方法?你想运行你的单元测试吗? – Schrieveslaach

SampleFlowTest.java运行目标test-compile应该在src/main/java树。

  • src/test/java为单元和集成测试类。

  • src/main/java是用于您的应用程序的类。

SampleFlowTest不是测试类,因为它包含一个static void main(String[] args)方法。 测试类应包含断言,但您的类不包含它们。 相反,它包含用于启动应用程序的机制:static void main(String[] args)

MVN高管:JAVA

是正在运行的程序。所以,默认情况下,我想它会搜索src/main/java中的执行类exec.mainClass

如果您不想更改布局,则可以配置exec:java目标以使用另一个作用域作为源作用域。

mvn exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest -Dexec.classpathScope="test" 
+0

请停止从我的答案复制!如果不通过'mvn test'或'test-compile'编译测试,你的命令将不起作用。 – Rocherlee

+0

我没有复制任何东西,因为我没有提到你的命令。你已经告诉过你自己。 所以,请冷静下来。我编辑了我的答案,以带来精度。他们与你的回应没有任何关系。 – davidxxx

+0

根据是否需要编译测试类,您是否适合'mvn test'。如果你使用IDE,它应该没用。与你相反,我解释了问题的原因。在第一部分中,我将讨论它的代码布局,这不是非常传统的。之后,我讨论如何绕过这个。我编辑绕过,但它与您的帖子没有任何关系。这需要时间,对不起,但它有助于人们了解问题,并提出如何绕过而不提供解释更有帮助。 – davidxxx

这是因为exec:java/src/test

编译测试您需要exec:java

mvn test-compile exec:java -Dexec.mainClass=com.myname.module.test.SampleFlowTest -Dexec.classpathScope=test 
+0

'exec:java'什么都不编译。这是运行程序类的目标。 默认情况下,在默认的'src/main/java'而不是'src/test/java'的项目的Maven sourceDirectory中运行程序类 – davidxxx

+0

我的意思是'exec:java'目标不映射到编译测试的任何默认maven阶段。所以只运行它不会编译'/ src/test'中的测试。 – Rocherlee

在您的测试类使用注释@Test上面要运行的方法:当你以这种方式运行命令,可以通过设置属性exec.classpathScope做到这一点。 此注释来自“org.junit.Test”。然后去终端,进入项目路径。就像如果你的Maven项目名称是“SampleApp”并且它的路径是“X”。 然后转到终端中的“/ X/SampleApp”。然后执行命令“mvn clean install”,它将运行您在“/ src/test ..”中编写的所有测试用例。

要运行单个测试或测试类,请参阅this链接。