春季从Docker进行Gradle多项目构建失败-java.lang.ClassNotFoundException:org.springframework

时间:2018-08-23 09:22:13

标签: docker spring-boot gradle

我正在尝试为多项目构建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文件

  • 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'

问题:

  1. 这行代码是否覆盖了每个微服务文件夹中声明的mainClassName,这就是问题所在?

  2. 从项目的根级别构建jar文件时,为什么不考虑每个微服务文件夹中的mainClassName声明。

在此先感谢您的任何输入:)

0 个答案:

没有答案
相关问题