You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala Maven项目Jar包执行报错,求正确配置与运行方案

解决Scala Maven项目Jar包执行问题

让我来帮你拆解下遇到的两个问题,并给出具体的修复方案:

问题根源分析

  1. no main manifest attribute 错误:你虽然在POM里加了<archive>配置,但位置放错了,导致Maven打包时没把主类信息写入Jar的MANIFEST.MF文件里。
  2. Could not find or load main class 错误:你指定的类名是com.test.scalapoc.App.scala,但编译后的类名应该是包名+类名(去掉.scala后缀),也就是com.test.scalapoc.App——.scala只是源文件的扩展名,不是类名的一部分。

具体修复步骤

1. 修正POM.xml的主类配置

你需要把主类配置放在正确的位置,推荐两种方式:

方式一:使用maven-jar-plugin专门配置Manifest

在<build>的<plugins>节点下添加这个插件,更清晰直观:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <archive>
            <manifest>
                <!-- 这里必须写完整的包名+类名 -->
                <mainClass>com.test.scalapoc.App</mainClass>
                <addClasspath>true</addClasspath>
            </manifest>
        </archive>
    </configuration>
</plugin>

方式二:调整scala-maven-plugin的配置位置

如果你想继续用scala-maven-plugin,要把<archive>移到插件的全局<configuration>下,而不是某个<execution>内部:

<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <version>3.2.0</version>
    <!-- 全局配置里放Manifest信息 -->
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.test.scalapoc.App</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-dependencyfile</arg>
                    <arg>${project.build.directory}/.scala_dependencies</arg>
                </args>
            </configuration>
        </execution>
    </executions>
</plugin>

2. 重新打包并执行Jar

修改完POM后,先清理并重新打包:

mvn clean package

之后用以下两种方式执行都可以:

  • 方式一:直接用java -jar(此时Manifest已包含主类信息)
java -jar target/scalapoc-0.0.1.jar
  • 方式二:用java -cp指定类路径和类名
java -cp target/scalapoc-0.0.1.jar com.test.scalapoc.App

额外优化:打包包含所有依赖的可执行Jar

如果你的项目依赖了外部库(比如scala-library),直接运行上面的Jar可能会出现找不到依赖类的错误。这时候可以用maven-shade-plugin打一个包含所有依赖的“胖Jar”:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.4.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.test.scalapoc.App</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

打包后生成的Jar会包含所有依赖,直接用java -jar就能运行,不用担心依赖缺失问题。


内容的提问来源于stack exchange,提问作者Avijit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:23