Я создаю образ Docker для моего проекта Java Gradle. В моем файле Docker, как я пришел к пониманию. Выполнение dockerFile с использованием Gradle docker
создает образ для моего файла docker, готового к выполнению. он также создает JAR-файл для выполнения моего проекта Gradle. Мой файл Docker выглядит следующим образом:
FROM openjdk:13-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} ./app.jar
CMD ["java","-jar","app.jar" , "Simulator.NewMain"]
и build.gradle выглядит следующим образом:
buildscript {
dependencies {
classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.8.2'
}
repositories {
mavenLocal()
mavenCentral()
}
}
plugins {
id 'com.palantir.docker' version '0.22.1'
id 'java'
}
allprojects {apply plugin: 'idea'}
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'Simulator.NewMain'
repositories {
mavenCentral()
mavenLocal()
jcenter()
maven { url "http://streamreasoning.org/maven" }
maven { url "http://service.hucompute.org/artifactory/libs-release" }
maven { url "https://raw.githubusercontent.com/alexeygrigorev/maven-repo/master/" }
}
docker {
name "hi"
dockerfile file('src/docker/Dockerfile')
copySpec.from(jar).rename(".*","app.jar")
buildArgs(['JAR_FILE' : "app.jar"])
}
jar {
manifest {
attributes(
'Main-Class': 'Simulator.NewMain'
)
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
dependencies {
//compile project(':shared')
compile files('libs/mdsj.jar')
// https://mvnrepository.com/artifact/org.apache.commons/commons-math3
compile group: 'org.apache.commons', name: 'commons-math3', version: '3.0'
// https://mvnrepository.com/artifact/org.ujmp/ujmp-core
compile group: 'org.ujmp', name: 'ujmp-core', version: '0.3.0'
// https://mvnrepository.com/artifact/com.datumbox/lpsolve
compile group: 'com.datumbox', name: 'lpsolve', version: '5.5.2.0'
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.1'
// https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.7.2'
// https://mvnrepository.com/artifact/junit/junit
testCompile group: 'junit', name: 'junit', version: '4.4'
// https://mvnrepository.com/artifact/net.sourceforge/javaml
compile group: 'net.sourceforge', name: 'javaml', version: '0.1.7'
compile group: 'be.abeel', name: 'ajt', version: '2.9'
}
Мой Dockerfile создает файл JAR в образе моего докера, называемый app.jar. Затем я пытаюсь запустить этот файл JAR в образе. Однако каждый раз, когда я пытаюсь это сделать, я сталкиваюсь с этой ошибкой.
Error: Could not find or load main class NewMain.class
Caused by: java.lang.ClassNotFoundException: NewMain.class
результат успешного выполнения моих сборок Gradle docker
, однако выполнение docker run DockerImage
, где DockerImage - имя моего образа, приводит к указанной выше ошибке. Я попытался создать изображение jar из того же проекта и выполнить его, используя java -cp app.jar
, но я все еще получаю ту же ошибку. Я также просмотрел классы jar-файла и нашел класс, который пытаюсь выполнить. класс NewMain - это простой класс println со следующим синтаксисом:
package Simulator;
public class NewMain {
public static void main(String[] args) {
System.out.println("hi");
}
}
Кто-нибудь знает, как преодолеть ошибку classnotfound? или причина этого происходит? PS: Я подозревал, что причина может быть в моей версии JDK, поэтому я обновил до JDK13