我正在尝试为多项目构建jar。 文件夹树结构:
ROOT_FOLDER
MICRO_SERVICE_1
SRC
BUILD.GRADLE(在microservice_1内部)
buildscript {
ext {
springBootVersion = '2.0.4.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.impact'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
ext {
springCloudVersion = 'Finchley.SR1'
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-hateoas')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile 'mysql:mysql-connector-java'
compile 'org.springframework.boot:spring-boot-starter-security'
compile 'io.jsonwebtoken:jjwt:0.9.0'
compile 'org.springframework.boot:spring-boot-starter-tomcat'
compile 'org.modelmapper:modelmapper:2.0.0'
compile 'com.amazonaws:aws-java-sdk-ses'
compile 'org.junit.jupiter:junit-jupiter-engine'
testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
bootJar {
mainClassName = 'com.impact.authservice.AuthServiceApplication'
}
ROOT LEVEL BUILD.GRADLE文件
plugins {
id 'application'
id 'java'
id 'com.github.johnrengelman.shadow' version '2.0.4'
}
allprojects {
apply plugin: 'application'
apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'
repositories {
mavenCentral()
}
ext {
impactVersion = '1.0.0'
commitTimestamp = {
return "git log -1 --pretty=format:%cd --date=format:%Y%m%d%H%M%S".execute().text.trim()
}
commitId = {
return "git rev-parse --short HEAD".execute().text.trim()
}
buildId = {
if (System.getenv("BUILD_ID") != null) return ".${System.getenv("BUILD_ID")}"
else return ""
}
}
group = 'com.impact'
version = System.getenv("APP_VERSION") ?: "${commitTimestamp()}.${commitId()}${buildId()}"
sourceCompatibility = '1.8'
mainClassName = 'org.springframework.boot.loader.JarLauncher'
dependencies {
}
task copyDeps(type: Copy) {
from (configurations.runtime + configurations.testRuntime) exclude '*'
into '/tmp'
}
test {
testLogging {
events "passed", "skipped", "failed"
}
reports {
junitXml.enabled = true
junitXml.destination = file("${rootProject.projectDir}/build/test-results/junit")
html.enabled = false
}
}
}
shadowJar {
destinationDir = file("${rootProject.projectDir}/build/jars")
classifier = 'fat'
}
wrapper {
gradleVersion = '4.8'
}
技术和工具:
Spring Boot
Spring Cloud
成绩
Makefile
Docker
Intellij
项目说明:
我有一些使用Spring Boot和Spring Cloud构建的微服务。
代码很好,应用程序可以在本地主机上正常运行。
当前状态:
当我从根文件夹运行“ Gradle build”成功时,默认情况下,将为微服务的每个文件夹生成build文件夹。
Jar文件运行正常,应用程序正常运行。
现在我将微服务放入docker容器中。
Dockerfile:
FROM openjdk:8-jdk-alpine
MAINTAINER Me
LABEL application=test-dev
# Install system dependencies
RUN echo "http://nl.alpinelinux.org/alpine/edge/testing/" >> /etc/apk/repositories && \
apk update && \
apk add --no-cache bash libstdc++ nodejs nodejs-npm git && \
npm install yarn -g
# Install common dependencies
COPY gradle /app/gradle
COPY build.gradle settings.gradle gradlew /app/
WORKDIR /app/
RUN chmod +x /app/gradlew && \
./gradlew copyDeps
# Install module dependencies
COPY microservice_1/build.gradle /app/microservice_1/
COPY microservice_2/build.gradle /app/microservice_2/
# App version and App sourses
ARG app_version
ENV APP_VERSION=${app_version}
COPY microservice_1 /app/microservice_1
COPY gateway /app/gateway
COPY microservice_2 /app/microservice_2
docker-compose.yml文件:
version: '3'
services:
test:
build:
context: ../../
dockerfile: docker/test/Dockerfile
args:
app_version: ${APP_VERSION}
command:
- /app/gradlew
- clean
- test
- shadowJar
要构建dockerfile并生成jar文件,请使用makefile。
此命令将构建dockerfile并尝试将构建文件夹从docker容器复制到我的项目的根位置。
制作文件片段:
test:
${INFO} "Building images..."
@ docker-compose $(TEST_ARGS) build test
${INFO} "Running tests..."
@ docker-compose $(TEST_ARGS) up test
@ mkdir -p $(TEST_DIR)
${INFO} "Removing existing artefacts..."
@ rm -rf build
${INFO} "Copying build artefacts..."
@ docker cp $$(docker-compose $(TEST_ARGS) ps -q test):/app/build/. build
${INFO} "Test complete"
实际状态:
每个微服务的所有jar都生成到位于我的根文件夹中的build文件夹中
所需状态: Jar应该是可执行的,并且应与在我的计算机上运行“ Gradle build”时使用的方式相同。
出现问题:
当我尝试运行生成的jar时,出现错误:
spring-java.lang.ClassNotFoundException:org.springframework
自从我尝试解决问题以来已经过去了15个小时,我觉得带有主类声明的根级别gradle.build文件存在问题。
mainClassName ='org.springframework.boot.loader.JarLauncher'
问题:
这行代码是否覆盖了每个微服务文件夹中声明的mainClassName,这就是问题所在?
从项目的根级别构建jar文件时,为什么不考虑每个微服务文件夹中的mainClassName声明。
在此先感谢您的任何输入:)