首页 > 解决方案 > 尝试访问 .jar 文件中的内部静态枚举时出现编译错误

问题描述

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

消息.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

服务器.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

标签: javaenumsjar

解决方案


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

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

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

枚举的名称是 Message$Status,但美元符号需要转义,就\$好像这是 Linux 或类似的。


推荐阅读