簡體   English   中英

如何使用包名為java類定義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 ,它工作正常。

我現在正在嘗試使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM