От Maven, как мне запустить класс, который работает в src/test/java?
Я унаследовал кодовую базу:)
В src/test/java/есть файл, который мне нужно запустить (мне нужно запустить его метод public static void main(String[] args)
, а не @Test
).
Ближайшее я получил:
mvn -e exec:java -Dexec.mainClass="com.me.packagex.RunFile" -Dexec.classpathScope="test"
но это не работает, и похоже, что RunFile хочет использовать классы, которые существуют в src/main/java/com/me/packagex/(уведомление,/main/, not/test/). Файлы под ним находятся в том же пакете, что и RunFile, т.е. "Пакет com.me.packagex;".
Если я удалю -Dexec.classpathScope="test"
, то он вообще не сможет найти RunFile. Это как если бы мне нужно было дать две области, но он не принимает "test, compile".
Человек, которому я унаследовал это от (дорого ушел), использовал его для запуска из Eclipse. Мне нужен способ запустить его из командной строки.
Надеюсь, это ясно объяснено.
tyvm,
Это многообещающе. Паскаль, я пробовал ваш пример, и это не работает для меня.
Хотя теперь я смотрю на это - это не нахождение Демо, а не нахождение собаки.
Apache Maven 2.2.1 (rdebian-1)
Java version: 1.6.0_18
Java home: /usr/lib/jvm/java-6-openjdk/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-25-generic" arch: "i386" Family: "unix"
$ mvn -e exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test"
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] An exception occured while executing the Java class. com.stackoverflow.Demo
[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. com.stackoverflow.Demo
at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:346)
at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
... 17 more
Caused by: java.lang.ClassNotFoundException: com.stackoverflow.Demo
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:284)
at java.lang.Thread.run(Thread.java:619)
Ответы
Ответ 1
(...) Надеюсь, это ясно объяснено.
Неплохо, но я не могу воспроизвести. Я создал проект:
$ mvn archetype:generate -DgroupId=com.stackoverflow \
-DartifactId=Q4060613 \
-Dversion=1.0-SNAPSHOT \
-DarchetypeArtifactId=maven-archetype-quickstart
Затем cd
ed в него и создал класс Dog
(под src/main/java
):
$ cd Q4060613
$ cat > src/main/java/com/stackoverflow/Dog.java
package com.stackoverflow;
public class Dog {
public String bark() {
return "woof!";
}
}
и создал класс Demo
(под src/test/java
):
$ cat > src/test/java/com/stackoverflow/Demo.java
package com.stackoverflow;
public class Demo {
public static void main(String[] args) {
System.out.println(new Dog().bark());
}
}
После компиляции исходного кода выполнение команды, которую вы предоставили, работает как ожидалось:
$ mvn test
...
$ mvn exec:java -Dexec.mainClass="com.stackoverflow.Demo" -Dexec.classpathScope="test"
[INFO] Scanning for projects...
...
[INFO] --- exec-maven-plugin:1.2:java (default-cli) @ Q4060613 ---
woof!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
Что-то еще должно быть неправильно.
Ответ 2
Включите следующие строки в pom.xml в плагине exec-maven-plugin. <classpathScope>test</classpathScope>
раздел плагина в POM выглядит примерно так:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>my-execution</id>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.example.MainClass</mainClass>
<classpathScope>test</classpathScope>
</configuration>
</plugin>
Примечание: com.example.MainClass - это класс, содержащий основной метод.
Ответ 3
Я столкнулся с той же проблемой и понял ее.
Вкратце, класс должен быть скомпилирован до цели exec:java
. (Конечно, он работает без фазы test-compile
, если класс уже скомпилирован другим действием пользователя. Обратите внимание, что Pascal Thivent, его ответ, вызывается mvn test
до exec:java
.)
$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test test-compile exec:java
Вы можете доказать это сами, если хотите снова увидеть ClassNotFoundException
.
$ mvn -Dexec.mainClass=... -Dexec.classpathScope=test clean exec:java
Ответ 4
Хорошо, подстегнутый этим, работая для всех остальных, я немного вырыл. Код не очень хорошо сообщал о своих проблемах, и я неправильно искал стек.
Он делает:
FileInputStream is = new FileInputStream("lib/other-thing.jar");
который терпел неудачу. Я символически соединил trunk/src/main/assembly/lib/в trunk/, и теперь он работает. Возможно, существует более аккуратный способ исправить это, тогда символическая ссылка.
Благодарим вас.