【问题标题】:maven-jar-plugin not finding my main classmaven-jar-plugin 找不到我的主类
【发布时间】:2017-04-21 08:17:49
【问题描述】:

我有一个 Java/Selenium/TestNG/Maven 项目。我可以成功创建 myproj-0.0.1-SNAPSHOT.jar 文件。当我尝试运行它时出现错误:

$ java -jar myproj-0.0.1-SNAPSHOT.jar
Error: Could not find or load main class utilities.MavenTestInvoker

我的主要目标是能够运行这个 SNAPSHOT.jar 文件以在远程机器上运行我的测试用例。

我在 pom.xml 中使用构建插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>testng.xml</suiteXmlFile>
                </suiteXmlFiles>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>utilities.MavenTestInvoker</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

当我构建项目时,我使用 maven 命令:“mvn clean package shade:shade”

这创建了我的超级 jar。

以下是依赖项:

<dependencies>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.shared</groupId>
        <artifactId>maven-invoker</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
    </dependency>
plus some others
</dependencies>

我做错了什么?

【问题讨论】:

  • mainClass 在这里应该做什么?你也没有分享在你的 pom 中定义 shade 插件的内容
  • 另外,您能否简单描述一下您完成上述所有工作的最终目标是什么?
  • @nullpointer 我希望能够运行新创建的 jar 文件:java -jar myproj-0.0.1-SNAPSHOT.jar 并让它运行我的 selenium 测试用例。
  • @nullpointer mainClass 应该是我的 java 程序的入口点。它应该从实用程序包和 MavenTestInvoker 类中获取 main 方法。
  • 使用 maven 插件作为依赖是完全错误的。你可以使用exec-maven-plugin来启动一个jar

标签: java maven


【解决方案1】:

包含插件依赖的正确用法如下,可以在一个地方合并插件依赖-

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.2</version>
            <!--Notice I have removed the configs here. Not required to generate the jar-->
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.0.1</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.shared</groupId>
                <artifactId>maven-invoker</artifactId>
                <version>2.2</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

您还可以在同一声明中编辑相应的插件配置。

对于使用maven-shade-pluginmaven-jar-plugin,您可能需要分别查看示例herehere

【讨论】:

  • 这些是依赖项。它是这样工作的吗?还是我应该在插件周围使用它?
  • @WillByers 如果您没有在代码中使用它们的任何实现,这些是插件依赖项。我建议在&lt;plugins&gt; 中使用它们。这取决于您最终要达到的目标。
  • 好吧,你说的话的重量终于沉没了。我已经对我的 pom.xml 文件进行了更改。但是,我仍在尝试将入口点设置到我的 jar 中。我不需要配置,所以我可以说明主要方法在哪里?
  • jar如何知道在utilities.MavenTestInvoker类中寻找main方法?
  • 啊,是的,我看到了@nullpointer。我认为他们想要指定一个主类,以便他们可以直接使用java -jar ... 启动他们的 jar,而不是在命令行上指定它。我想需要澄清一下。
【解决方案2】:

请记住,您的项目必须具有正确的文件夹结构,例如您的代码必须在 src/main/java 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 2012-01-07
    相关资源
    最近更新 更多