javac不会编译枚举,(Windows Sun 1.6 - > OpenJDK 1.6)

时间:2011-11-11 03:39:36

标签: java javac openjdk

package com.scheduler.process;

public class Process {
    public enum state {
        NOT_SUBMITTED, SUBMITTED, BLOCKED, READY, RUNNING, COMPLETED 
    }
        private state currentState;

    public state getCurrentState() {
        return currentState;
    }

    public void setCurrentState(state currentState) {
        this.currentState = currentState;
    }

}



package com.scheduler.machine;
import com.scheduler.process.Process;
import com.scheduler.process.Process.state;

public class Machine {
    com.scheduler.process.Process p = new com.scheduler.process.Process();
    state s = state.READY;  //fails if I don't also explicitly import Process.state
    p.setCurrentState(s);  //says I need a declarator id after 's'... this is wrong.
    p.setCurrentState(state.READY);
}

修改了示例以尝试直接解决问题。我无法更改此代码的状态。 Eclipse建议在我之前的示例中导入Process.state like,但这也不起作用。这允许state s = state.READY,但对p.setCurrentState(s);的调用失败,p.setCurrentState(state.READY);

也失败

问题仍在继续......根据奥列格的建议,我尝试了更多的排列:

package com.scheduler.machine;
import com.scheduler.process.Process;
import com.scheduler.process.Process.*;

public class Machine {
    com.scheduler.process.Process p = new com.scheduler.process.Process();
    public state s = Process.state.READY;  
    p.setCurrentState(s);
    p.setCurrentState(state.READY);
}

好。现在很清楚,我是切除术的候选人。

package com.scheduler.machine;

import com.scheduler.process.Process;
import com.scheduler.process.Process.state;

public class Machine {

    public void doStuff(){
        com.scheduler.process.Process p = new com.scheduler.process.Process();
        state s = state.READY;  //fails if I don't also explicitly import Process.state
        p.setCurrentState(s);  //says I need a declarator id after 's'... this is wrong.
        p.setCurrentState(state.READY);
    }

}

我需要在课堂上有一个方法 - 但我们仍然缺少一些东西(可能很明显)。当我通过命令行并在编译Process后的Machine类上运行javac时,我仍然收到以下错误:

mseil@context:/media/MULTIMEDIA/Scratch/Scratch/src/com/scheduler/machine$ javac Machine.java Machine.java:3: package com.scheduler.process does not exist import com.scheduler.process.Process; ^

所以我想现在的问题变成了,我错过了什么白痴,这让我无法手工编写日食在幕后为我做的事情?

====== 这里解决的问题:
Java generics code compiles in eclipse but not in command line

2 个答案:

答案 0 :(得分:3)

这对我有用:

  1. 下载最新的Eclipse
  2. 创建新项目
  3. 创建两个包com.scheduler.processcom.scheduler.machine
  4. Process包中创建类com.scheduler.process,在Machine中创建类com.scheduler.machine,并从帖子中复制它们的内容,修改它们以符合Java语言语法,如下所示: enter image description here enter image description here
  5. 一切都在马上编译。
  6. ------回答以前版本的问题------

    现在就回答这个问题:你需要 import com.scheduler.process.Process.statusimport com.scheduler.process.Process.*,并将状态称为status

    import com.scheduler.process.*import com.scheduler.process.Process,并将状态称为Process.status

    ------回答问题的原始版本------

    1. 您无法导入不在某个包内的类。你不能。 It is a compile time error to import a type from the unnamed package

    2. 如果您的课程在同一个套餐中,或者您的所有课程都是无包装的,则无需导入任何内容。

    3. 如果Process类在某个包中,则可以只导入其状态内部类:import a.b.c.Process.status可以正常工作。

    4. 所有Windows / Linux迁移问题与您看到的Java和异常无关。 import Process.state;将在任何操作系统上产生异常,因为您无法导入不属于任何包的类。

答案 1 :(得分:1)

默认情况下,Eclipse不使用Sun JDK。我假设你使用Eclipse的内置编译器作为Sun的JDK和OpenJDK几乎完全相同。

Java代码在大多数情况下在Windows和Linux上编译和运行完全相同(除非您使用一些特定于平台的操作)

我怀疑您没有以相同的方式构建代码,当您编译Machine时,Process类尚未编译。

我建议您使用标准的构建系统,如mavenant,它将在任何地方构建相同的内容。如果在Linux上运行Eclipse或者在Windows上运行的.class运行失败,则无需在任何情况下重新编译它们。

顺便说一句:你不需要导入Process.state,因为它没有使用它和它在同一个包中(如果你这样做就不需要)