问题在于您的 Shade 插件的配置,该插件当前为
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>bot.Main</mainClass>
</manifest>
</archive>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>launcher</shadedClassifierName>
</configuration>
没有<archive>
参数到shade goal https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html。您使用的配置元素不存在这一事实不是一个错误 https://stackoverflow.com/a/40601037/1743880,配置将被忽略,这解释了为什么你的主类没有在清单中设置。
要使用 Shade 插件构建可执行 JAR,您需要提供ManifestResourceTransformer https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html as a transformers https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#transformers。正确的配置是:
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>bot.Main</mainClass>
</transformer>
</transformers>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>launcher</shadedClassifierName>
</configuration>
请注意,使用此配置时,阴影 JAR 将不会替换主 JAR。shadedArtifactAttached https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadedArtifactAttached被设定为true
,这意味着阴影 JAR 将作为辅助工件附加到项目中。它将与主 JAR 区分开来,其分类器为launcher
,即shadedClassifierName https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadedClassifierName范围。
运行后mvn clean package
在此项目中,您将创建 2 个 JAR:
-
mavenproject1-1.0-SNAPSHOT.jar
,这是主要的 JAR。该 JAR 仅包含应用程序的已编译 Java 源代码。它不可执行,并且不包含所有依赖项的类。
-
mavenproject1-1.0-SNAPSHOT-launcher.jar
是阴影附加的 JAR,它是由 Shade 插件构建的。这个是可执行的并且包含依赖项的类。
这意味着如果您想将应用程序作为可执行 JAR 启动,则必须启动-launcher.jar
,而不是另一个,与
java -jar mavenproject1-1.0-SNAPSHOT-launcher.jar
顺便说一句,这两个 JAR 都将包含位于<directory>src/main/java/resources</directory>
,因为它们是项目本身的资源,正如声明的那样<resource>
元素。然而,最好尊重标准目录布局 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html并将资源放入src/main/resources
反而。