基于Maven构建的Spring Boot应用部署Azure AKS时主类找不到
Spring Boot应用部署AKS后出现ClassNotFoundException问题
本地运行正常的Maven构建Spring Boot应用,通过GitHub Action部署到Azure Kubernetes(AKS)后Pod进入错误状态,日志报错如下:
Exception in thread "main" java.lang.ClassNotFoundException: package com.LearnBS.JavaBS.JavaBsApplication at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592) at org.springframework.boot.loader.net.protocol.jar.JarUrlClassLoader.loadClass(JarUrlClassLoader.java:107 at org.springframework.boot.loader.launch.LaunchedClassLoader.loadClass(LaunchedClassLoader.java:91) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:99) at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40)
相关配置文件
pom.xml
<name>JavaBS</name> <description>Demo project for Spring Boot</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>5.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-core --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-core</artifactId> <version>5.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>package com.LearnBS.JavaBS.JavaBsApplication</mainClass> </configuration> <!--<configuration> --> <!-- <mainClass>package com.LearnBS.JavaBS.JavaBsApplication</mainClass>--> <!--</configuration>--> </plugin> </plugins> </build>
GitHub Action工作流文件
name: Maven Package on: push: branches: [ master ] jobs: build: runs-on: ubuntu-latest permissions: contents: read packages: write id-token: write steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'adopt' - name: Build with Maven run: mvn clean install spring-boot:repackage - name: Docker Login uses: azure/docker-login@v1 with: login-server: aksfirstregistry.azurecr.io username: xxxxxxxxxxxxx password: bxxxxxxxxxxxxxxxxx - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build and Push to ACR uses: docker/build-push-action@v6 with: context: . push: true tags: aksfirstregistry.azurecr.io/g********:latest file: Dockerfile # Logs in with your Azure credentials - name: Log in to Azure uses: azure/login@v1 with: creds: | { "clientId": xxxxxxxxxxxxxx, "clientSecret": xxxxxxxxxxxx, "tenantId": xxxxxxxxxxxx, "subscriptionId": xxxxxxxxxxxx; } - name: Set AKS context id: set-context uses: azure/aks-set-context@v3 with: resource-group: xxxxxxxxx cluster-name: xxxxxxxxxxx - name: Setup kubectl id: install-kubectl uses: azure/setup-kubectl@v3 - name: Deploy to AKS id: deploy-aks uses: Azure/k8s-deploy@v4 with: namespace: 'default' manifests: | gitmongodb.yaml images: aksfirstregistry.azurecr.io/gxxxxx:latest pull-images: false
解决方案
修正pom.xml主类配置
错误日志中显示找不到的类名是package com.LearnBS.JavaBS.JavaBsApplication,明显是pom.xml里spring-boot-maven-plugin的mainClass配置多了package关键字。正确的全限定类名不需要前缀package,修改如下:<configuration> <mainClass>com.LearnBS.JavaBS.JavaBsApplication</mainClass> </configuration>简化Maven构建命令
mvn clean install spring-boot:repackage可以简化为mvn clean package,因为Spring Boot Maven插件会在package阶段自动执行repackage操作,生成可执行jar包。验证Dockerfile配置
确保Dockerfile正确复制并启动jar包,示例配置如下:FROM openjdk:17-jdk-slim WORKDIR /app COPY target/JavaBS-*.jar app.jar ENTRYPOINT ["java", "-jar", "/app/app.jar"]注意jar包的路径和名称要和构建产物一致。
更新GitHub Action的镜像拉取配置
将Deploy to AKS步骤中的pull-images: false改为pull-images: true,确保AKS拉取最新推送的镜像,避免使用旧的有问题的镜像缓存。
完成以上修改后,重新触发GitHub Action构建部署即可解决问题。
内容的提问来源于stack exchange,提问作者AndroidFreak
相关产品推荐
相关产品推荐

