[英]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
,它工作正常。
我現在正在嘗試使用 dockerfile 構建和運行它,我當前的 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 提到的方式進行操作可能是您最好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.