Scala Maven项目Jar包执行报错,求正确配置与运行方案
解决Scala Maven项目Jar包执行问题
让我来帮你拆解下遇到的两个问题,并给出具体的修复方案:
问题根源分析
no main manifest attribute错误:你虽然在POM里加了<archive>配置,但位置放错了,导致Maven打包时没把主类信息写入Jar的MANIFEST.MF文件里。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
相关产品推荐
相关产品推荐

