尝试访问 .jar 文件中的内部静态枚举时出现编译错误

Compilation error when try to access inner static enum in a .jar file

我正在尝试访问 .jar 文件中的内部静态枚举状态,但出现编译错误,我不知道为什么。

Message.java:

package com.sockets.protocol;

public class Message {

    public static enum Status {
        OK, ERROR, PARAMERROR, REQUEST;
    }

    private String operation;

    public Message(String operation) {
        this.operation = operation;
    }

    // more code here but irrelevant for this problem
}

正在编译和创建 .jar 文件:

javac -d . com/sockets/protocol/Message.java
jar -cvf Message.jar com/sockets/procotol/Message.class

Server.java

package com.sockets.server;

import com.sockets.protocol.Message;

public class Server implements Serializable {

    private int port;
    private Message message;

    public Server(int port) {
        this.port = port;
        this.message = new Message("op-test")
        System.out.println("test status: " + Message.Status.OK);
        System.out.println("test operation: " + message.getOperation());
    }
}

当我注释掉第一个 System.out.println 时程序运行正常。那么我该如何解决这个问题?

错误信息:

[xxx@xxxxxxx src]$ javac -cp .:../library/Message.jar -d . com/sockets/server/Main.java
./com/sockets/server/Server.java:31: error: cannot access Status
        System.out.println("teste message: " + Message.Status.OK);
                                                      ^
  class file for com.sockets.protocol.Message$Status not found
1 error

您需要明确地将所有 类 放入 jar。

jar -cvf Message.jar Message.class Message$Status.class

您会注意到 'v' 选项告诉您将要放入 jar 中的内容,在您的情况下,未列出 Status 枚举。

枚举的名称是 Message$Status,但如果这是 Linux 或类似的名称,则美元符号需要转义为 $