如何使用包名称为 java class 定义 Dockerfile?
How to define Dockerfile for java class with package name?
我在尝试 运行 一个简单的 java 文件时遇到了一个问题,该文件具有与之关联的包名称。我的文件是:
package com.example.springboot.folder.folder1;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
要编译上面的代码,我使用 javac HelloWorld.java
但要 运行 它我需要转到 \com 和 运行 java com.example.springboot.folder.folder1.HelloWorld
之前的文件夹结构,它工作正常.
我现在正在尝试使用 docker 文件构建并 运行 它,我当前的 docker 文件如下:
FROM alpine
WORKDIR /root/testdir
COPY HelloWorld.java /root/testdir
RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin
RUN javac HelloWorld.java
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"
与HelloWorld.java程序
同级
当我尝试使用 docker build .
和 运行 使用 docker run imageid
进行构建时,出现以下错误:
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
任何人都可以帮助我解决可能出错的地方吗?
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"
您可以简单地调用此命令:CMD java HelloWorld
,运行 您在第一个命令后生成的 HelloWorld.class
文件将是什么:RUN javac HelloWorld.java
.
但这不是一个好方法。您应该为 Docker 图像提供一个 jar
文件,然后调用此命令:CMD ["java", "-jar", "/HelloWorld.jar"]
。
您需要打包您的项目并将其复制到您的 docker 图像中。
您需要保留包结构才能正常工作。
在您只需复制 java 源代码的地方,您需要复制整个目录才能正常工作。
您的 Dockerfile 应该如下所示:
FROM alpine
WORKDIR /root/testdir
ADD com /root/testdir/com
RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin
RUN javac com/example/springboot/folder/folder1/HelloWorld.java
CMD ["java", "com.example.springboot.folder.folder1.HelloWorld"]
当然,打包最好使用 .jar,所以按照 Harry Coder 提到的方法可能是最好的选择。
我在尝试 运行 一个简单的 java 文件时遇到了一个问题,该文件具有与之关联的包名称。我的文件是:
package com.example.springboot.folder.folder1;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
要编译上面的代码,我使用 javac HelloWorld.java
但要 运行 它我需要转到 \com 和 运行 java com.example.springboot.folder.folder1.HelloWorld
之前的文件夹结构,它工作正常.
我现在正在尝试使用 docker 文件构建并 运行 它,我当前的 docker 文件如下:
FROM alpine
WORKDIR /root/testdir
COPY HelloWorld.java /root/testdir
RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin
RUN javac HelloWorld.java
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"
与HelloWorld.java程序
同级当我尝试使用 docker build .
和 运行 使用 docker run imageid
进行构建时,出现以下错误:
Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
任何人都可以帮助我解决可能出错的地方吗?
CMD java -cp "java com.example.springboot.folder.folder1.HelloWorld"
您可以简单地调用此命令:CMD java HelloWorld
,运行 您在第一个命令后生成的 HelloWorld.class
文件将是什么:RUN javac HelloWorld.java
.
但这不是一个好方法。您应该为 Docker 图像提供一个 jar
文件,然后调用此命令:CMD ["java", "-jar", "/HelloWorld.jar"]
。
您需要打包您的项目并将其复制到您的 docker 图像中。
您需要保留包结构才能正常工作。 在您只需复制 java 源代码的地方,您需要复制整个目录才能正常工作。
您的 Dockerfile 应该如下所示:
FROM alpine
WORKDIR /root/testdir
ADD com /root/testdir/com
RUN apk add openjdk8
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:$JAVA_HOME/bin
RUN javac com/example/springboot/folder/folder1/HelloWorld.java
CMD ["java", "com.example.springboot.folder.folder1.HelloWorld"]
当然,打包最好使用 .jar,所以按照 Harry Coder 提到的方法可能是最好的选择。