【问题标题】:exec-maven-plugin could not find or load main class but output runs fine on the command lineexec-maven-plugin 无法找到或加载主类,但输出在命令行上运行良好
【发布时间】:2014-01-23 20:04:20
【问题描述】:

我尝试使用 exec-maven-plugin 来运行 Java 程序。

我使用下面的 pom sn-p:

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
             <configuration>
                    <executable>java</executable>
                        <arguments>
                         <argument>-Dmyproperty=myvalue</argument>
                            <argument>-cp</argument>
                            <argument>"/home/vogella/libs/*"</argument>
                            <argument>com.vogella.test.Main</argument>
                        </arguments>
    </configuration>


</plugin>

com.vogella.test.Main 类包含在位于 /home/vogella/libs/* 的 jar 文件之一中。如果我运行 mvn -X clean install exec:exec 命令,我会看到以下错误消息:

[DEBUG] 执行命令行:java -Dmyproperty=myvalue -cp “/home/vogella/libs/*” com.vogella.test.Main 错误:无法找到或加载主类 com.vogella.test.Main

如果我在启动 Maven 构建的 shell 中复制命令行 (java -Dmyproperty=myvalue -cp "/home/vogella/libs/*" com.vogella.test.Main),则 Java 程序将正确执行。

知道我的 Maven 设置有什么问题吗?

【问题讨论】:

  • 该构建基于 Tycho 插件,它处理类路径的方式不同。默认不起作用

标签: java xml maven exec-maven-plugin


【解决方案1】:

正如前面的答案中提到的,Maven 不能很好地处理通配符。您应该遵循“maven way”并逐个传递它们,或者您可以尝试使用“commandlineArgs”来代替。

【讨论】:

  • 据我所知,exec-maven-plugin 不支持 commandlineArgs。如果我尝试使用它,至少我会收到错误消息。
【解决方案2】:

我不确定这是否可行,但也许你可以再试一次:

<commandlineArgs> 

相反。我遇到了与它相关的这个 JIRA 问题,这听起来像是你需要的。

【讨论】:

    【解决方案3】:

    你需要通过依赖来设置类路径。使用命令行参数 -cp 可以显式设置类路径,但这不适用于 maven cp。这是通过依赖构造的。

    <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includeProjectDependencies>false</includeProjectDependencies>
                    <includePluginDependencies>true</includePluginDependencies>
                    <mainClass>org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher</mainClass>
                    <arguments>
                        <argument>${project.basedir}/src/my/mavenized/GenerateHeroLanguage.mwe2</argument>
                    </arguments>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.eclipse.xtext</groupId>
                        <artifactId>org.eclipse.xtext.xtext</artifactId>
                        <version>2.5.0-SNAPSHOT</version>
                    </dependency>
                    <dependency>
                        <groupId>org.eclipse.xtext</groupId>
                        <artifactId>org.eclipse.xtext.xbase</artifactId>
                        <version>2.5.0-SNAPSHOT</version>
                    </dependency>
                </dependencies>
            </plugin>
    

    【讨论】:

    • 谢谢,但方法似乎有点复杂,只是添加了几个 jar 依赖项。我同意 ant runner 的建议。
    【解决方案4】:

    使用 CLI,/home/vogella/libs/* 表达式由 bash 扩展并解析为文件列表。使用 Maven,表达式是直接执行的,而不是扩展的。所以它仍然是“/home/vogella/libs/*”,它不是一个有效的 jar 文件。 通过使用 antrun 插件并在脚本中使用 java Ant 任务,您可能会获得更大的成功。 Ant 比其他任何东西都更了解通配符。

    【讨论】:

    • 谢谢。 Apache Ant 工作正常。我选择了这个解决方案。
    • 我不认为你说的是​​对的。从 Java 1.6 开始,它是理解类路径集的 java 可执行文件,如 foo/*。 Lars 的问题可能更多地与对 exec-maven-plugin 可以做什么的错误假设有关。我知道 exec-maven-plugin 允许您从 maven 项目的类路径启动一个 java 类。也就是说,它将处理类路径。添加 -cp 可能会搞砸。
    • FWIW,我发现以下页面解释了更好地管理类路径的选项:mojo.codehaus.org/exec-maven-plugin/examples/…。没有一个选项允许在项目依赖项之外指定 jars。
    猜你喜欢
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2014-07-04
    • 2016-01-06
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多