maven打jar在服务器上执行报错

文章描述了在使用Maven构建Flink项目时遇到的主类找不到问题,以及尝试的三种解决方案。方案一和二未能解决问题,而方案三通过修改maven-jar-plugin和maven-dependency-plugin的配置,成功打包并运行了项目。文章强调了maven-jar-plugin、maven-assembly-plugin和maven-shade-plugin在打包可执行jar时的差异和注意事项。

记录在实际开发中开发遇到的问题

maven 的flink项目,在pom文件里面的配置如下:

							<plugin>-->
<!--                <artifactId>maven-assembly-plugin</artifactId>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <version>2.6</version>-->
<!--                <configuration>-->
<!--                    <classifier>exec</classifier>-->
<!--                    <archive>-->
<!--                        <manifest>-->
<!--                            <mainClass>com.table.FlinkConnectHive</mainClass>-->
<!--                        </manifest>-->
<!--                    </archive>-->
<!--                    <descriptorRefs>-->
<!--                        <descriptorRef>jar-with-dependencies</descriptorRef>-->
<!--                    </descriptorRefs>-->
<!--                </configuration>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <id>make-assembly</id>-->
<!--                        <phase>package</phase>-->
<!--                        <goals>-->
<!--                            <goal>single</goal>-->
<!--                        </goals>-->
<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->

基于上面的配置,在执行了maven package操作 之后,执行java -jar 报错
找不到主类或属性

解决方案

方案1

首先判断是maven的pom文件配置有问题。修改pom文件如下:

						 <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-jar-plugin</artifactId>-->
<!--                <version>3.0.2</version>-->
<!--                <configuration>-->
<!--                    <archive>-->
<!--                        <manifest>-->
<!--                            <addClasspath>true</addClasspath>-->
<!--                            <mainClass>com.table.FlinkConnectHive</mainClass> &lt;!&ndash; 此处为主入口&ndash;&gt;-->
<!--                        </manifest>-->
<!--                    </archive>-->
<!--                </configuration>-->
<!--            </plugin>-->

执行maven complie,maven package之后,执行java -jar xxx.jar包。发现还是报同样的错误。

方案2

利用idea 里面的build来打jar包:
在这里插入图片描述在这里插入图片描述点击build之后会在当前项目的根目录下面产生out目录。
在这里插入图片描述在执行java -jar 操作之后还是报错找不到程序主类或者属性。很奇怪,执行操作的打包按这种方式是没有问题的。今天见鬼了。无语。继续找其他方案。

方案3

继续修改maven的配置参数:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.table.FlinkToConnectHive</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

在进过compie, maven package之后,在执行java -jar发现成功了,就很疑惑。上网查资料发现问题
这篇文章有说明:
https://blog.youkuaiyun.com/calm_encode/article/details/103931537/
在maven打包配置里面有三种方式:

  • maven-jar-plugin
    可执行jar包与依赖包是分开的,需要建立lib目录来存放所需的依赖包,且jar包与lib目录在同级别目录中
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>2.6</version>
                 <configuration>
                    <archive>
                         <manifest>
                             <addClasspath>true</addClasspath>
                             <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.xxx.xxxService</mainClass>
                       </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

  • maven-assembly-plugin
    该插件会将所有的依赖包放入可执行jar包,但是该插件会缺失spring的xds文件,导致jar包无法运行,而且当同级别目录下还有其他可执行文件依赖可能会产生冲突
             <plugin>
                 <artifactId>maven-assembly-plugin</artifactId>
                 <configuration>
                     <descriptorRefs>
                         <descriptorRef>jar-with-dependencies</descriptorRef>
                     </descriptorRefs>
                     <archive>
                         <manifest>
                             <mainClass>com.xxx.xxxService</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  • maven-shade-plugin
    该插件将所有的依赖包放入可执行的jar包中,当同级别目录中有其他的可执行jar包时,依赖可能会产生冲突,且运行jar包时,有时候会出现类似SF,DSA,RSA文件冲突的提示,选哟派相互META-INF目录下的文件
    <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.tooling</resource>
                                </transformer>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.xxx.xxxInvoke</mainClass>
                                </transformer>
                            </transformers>
                            <minimizeJar>true</minimizeJar>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

希望对于遇到类似的问题的小伙伴 有帮助,记得点一下赞!!!

<think>好的,用户遇到了Spring Boot打包JAR文件在服务器上启动时出现“没有主清单属性”的问题,需要解决。首先,我需要回忆一下相关知识点。主清单属性缺失通常是因为MANIFEST.MF文件中缺少Main-Class或Start-Class的定义,而Spring Boot项目通常通过spring-boot-maven-plugin或spring-boot-gradle-plugin自动生成这些信息。 根据用户提供的引用,比如引用[1]和[4]提到,缺少Main-Class属性会导致这个错误。引用[3]详细说明了主清单属性的作用,即指定包含main方法的类。所以问题可能出在构建过程中插件没有正确配置,导致生成的JAR文件没有正确配置清单文件。 接下来,我需要分步骤考虑解决方案。首先检查构建配置,确保使用了正确的插件。对于Maven项目,检查pom.xml中是否有spring-boot-maven-plugin,并且正确配置了repackage目标。对于Gradle项目,查看是否应用了org.springframework.boot插件。如果插件存在但问题依旧,可能需要手动指定主类,或者检查是否有其他插件覆盖了配置,比如maven-shade-plugin可能会影响清单文件的生成。 另外,用户可能需要检查生成的JAR文件中的MANIFEST.MF文件,确认是否存在Main-Class和Start-Class属性。如果这些属性缺失,说明构建过程有问题。如果存在,但值不正确,可能需要调整配置中的主类路径。 还需要考虑用户是否错误地打包了普通JAR而非可执行JAR。Spring Boot插件生成的JAR是可执行的,而普通maven-jar-plugin生成的不会包含必要的主清单属性。用户可能不小心使用了错误的插件或配置顺序,导致spring-boot-maven-plugin没有被执行。 总结可能的解决方案步骤:1. 确认构建工具中正确配置了Spring Boot插件。2. 检查插件版本和配置是否正确。3. 确保构建命令正确,例如使用mvn package或gradle bootJar。4. 手动检查生成的JAR清单文件。5. 排除其他插件的干扰。 同时,用户可能需要具体的配置示例,比如展示正确的pom.xml或build.gradle片段,以及如何验证生成的JAR文件。此外,提醒用户避免手动修改清单文件,而是通过构建插件自动生成,这样可以避免维护问题。 最后,生成相关问题,帮助用户深入理解问题原因和扩展知识,比如如何指定多个主类,或者处理多模块项目中的类似问题。</think>### 解决方案:Spring Boot JAR包缺少主清单属性(Missing Main-Manifest-Attribute) #### 问题原因 该错误表明打包JAR文件中缺少`Main-Class`或`Start-Class`属性,导致Java无法找到程序入口。Spring Boot项目需通过构建插件(如`spring-boot-maven-plugin`或`spring-boot-gradle-plugin`)自动生成这些属性[^1][^3][^4]。 --- ### 逐步解决步骤 #### 1. 检查构建插件配置 确保项目中已正确配置Spring Boot构建插件: - **Maven项目**:在`pom.xml`中添加以下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>当前Spring Boot版本</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 使用命令`mvn clean package`重新打包。 - **Gradle项目**:在`build.gradle`中确保应用了Spring Boot插件: ```groovy plugins { id 'org.springframework.boot' version '当前版本' id 'io.spring.dependency-management' version '1.0.11.RELEASE' } ``` 执行`gradle bootJar`生成可执行JAR。 #### 2. 验证构建命令 确保使用正确的命令生成可执行JAR: - **Maven**:避免单独执行`mvn jar:jar`,而应使用`mvn package`。 - **Gradle**:避免使用`jar`任务,改用`bootJar`任务。 #### 3. 检查其他插件冲突 若项目中使用了`maven-shade-plugin`或`maven-assembly-plugin`,需确保它们不会覆盖Spring Boot插件的配置。例如: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 删除手动指定的Main-Class --> </transformer> </transformers> </configuration> </plugin> ``` #### 4. 手动指定主类(可选) 在极少数情况下,需在插件中显式声明主类: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.YourApplication</mainClass> </configuration> </plugin> ``` #### 5. 验证生成的JAR 解压生成的JAR文件,检查`META-INF/MANIFEST.MF`中是否包含以下属性: ``` Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.example.YourApplication ``` --- ### 验证示例 运行命令检查JAR文件属性: ```bash unzip -p your-app.jar META-INF/MANIFEST.MF ``` 若输出包含上述属性,则问题已解决。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值