### 【已解决】KubeSphere DevOps 3.0 流水线构建的java服务jar包报错“没有主清单属性
使用DevOps 3.0 流水线 构建出来的制品jar,在执行
java -jar search-1.0-SNAPSHOT.jar
后显示
search-1.0-SNAPSHOT.jar 中没有主清单属性。
百度该错误,是由于制品jar下META-INF\MANIFEST.MF中缺少了Spring-Boot-Version、Main-Class、Start-Class、Spring-Boot-Classes、Spring-Boot-Lib五个Springboot相关的属性。
需要再pom文件中添加Springboot打包插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
但是我的pom文件中已经添加了该打包插件。
请教各位有没有遇到类似问题。求解决方案。
制品jar下META-INF\MANIFEST.MF文件内容:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: root
Created-By: Apache Maven 3.5.3
Build-Jdk: 1.8.0_232
pom文件内容:
`<?xml version=“1.0” encoding=“UTF-8”?>
<project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
<modelVersion>4.0.0</modelVersion>
<artifactId>search</artifactId>
<groupId>com.xxxxxx</groupId>
<version>1.0-SNAPSHOT</version>
<properties>
<nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
…………………………
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent-for-ut</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>agent-for-it</id>
<goals>
<goal>prepare-agent-integration</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>`
Jenkinsfile文件内容:
pipeline {
agent {
node {
label ‘maven’
}
}
stages {
stage(‘Checkout SCM’) {
steps {
git(url: ‘http://xx.xx.xx.xx:xxx/root/kubesphere-search.git’, credentialsId: ‘gitlab-id’, changelog: true, poll: false)
}
}
stage(‘Unit Test’) {
steps {
container(‘maven’) {
sh ‘mvn clean -gs pwd
/configuration/settings.xml’
}
}
}
stage('Build and Push') {
steps {
container('maven') {
sh 'mvn -gs `pwd`/configuration/settings.xml package -f pom.xml'
sh 'docker login --username=xxx --password=xxxx http://xx.xx.xx.xx:xxx'
sh 'docker build -f Dockerfile-on-prem -t $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .'
withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'HARBOR_PASSWORD' ,usernameVariable : 'HARBOR_USERNAME' ,)]) {
sh 'echo "$HARBOR_PASSWORD" | docker login $REGISTRY -u "$HARBOR_USERNAME" --password-stdin'
sh 'docker push $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER'
}
}
}
}
stage('Artifacts') {
steps {
archiveArtifacts 'target/*.jar'
}
}
stage('Deploy to Dev') {
steps {
input(message: '@admin', submitter: 'admin')
kubernetesDeploy(enableConfigSubstitution: true, deleteResource: false, kubeconfigId: '149-kubeconfig', configs: 'deploy/ks-search-ms-deployment.yaml')
}
}
}
}
configuration-settings.xml文件内容:
`<?xml version=“1.0” encoding=“UTF-8”?>
<settings xmlns=“http://maven.apache.org/SETTINGS/1.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd”>
<localRepository>/maven/repository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>public</id>
<mirrorOf>*</mirrorOf>
<name>Public Repositories</name>
<url>http://xx.xx.xx.xx:xxxx/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
`