javac не будет компилировать enum, (Windows Sun 1.6 -> OpenJDK 1.6) - PullRequest
0 голосов
/ 11 ноября 2011
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);
    }

}

Мне нужно было иметь метод в классе - но мы все еще что-то упускаем (вероятно, очевидно) здесь. Когда я иду через командную строку и запускаю javac в классе Machine ПОСЛЕ компиляции Process, я все равно получаю следующую ошибку:

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 компилируется в затмении, но не в командной строке

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Это только что сработало для меня:

  1. Загрузить последнюю версию Eclipse
  2. Создать новый проект
  3. Создать два пакета com.scheduler.process и com.scheduler.machine
  4. Создайте класс Process в пакете com.scheduler.process и класс Machine в com.scheduler.machine и скопируйте их содержимое из вашего поста, изменив его в соответствии с синтаксисом языка Java, например: enter image description here enter image description here
  5. Все компилируется сразу.

------, чтобы ответить на предыдущую версию вопроса ------

Чтобы ответить на вопрос как естьпрямо сейчас: вам нужно либо import com.scheduler.process.Process.status или import com.scheduler.process.Process.* и ссылаться на статус просто status

или

import com.scheduler.process.* или import com.scheduler.process.Process и ссылаться на статус Process.status

------ чтобы ответить на оригинальную версию вопроса ------

  1. Вы не можете импортировать классы, которые не находятся внутри некоторыхпакет.Ты просто не можешь. Ошибка импорта во время компиляции типа из неназванного пакета .

  2. Вам не нужно ничего импортировать, если ваши классы находятся в одном пакете,или если все ваши классы не содержат пакетов.

  3. Если бы класс Process находился внутри какого-либо пакета, можно было бы импортировать только его внутренний класс статуса: import a.b.c.Process.status работал бы просто отлично.

  4. Все ваши проблемы миграции на Windows / Linux не имеют ничего общего с Java и исключениями, которые вы видите.import Process.state; выдаст исключение в любой ОС, потому что вы не можете импортировать классы, которые не принадлежат ни одному пакету.

1 голос
/ 11 ноября 2011

Eclipse по умолчанию не использует Sun JDK. Я предполагаю, что вы используете встроенный компилятор Eclipse, поскольку JDK от Sun и OpenJDK практически идентичны.

Код Java компилируется и выполняется точно так же в Windows и Linux большую часть времени (если вы не используете некоторые из специфических для платформы операций)

Я подозреваю, что вы создаете код не так, и когда вы компилируете Machine, класс Process не был скомпилирован.

Я предлагаю вам использовать стандартную систему сборки, такую ​​как maven или ant, и она будет собираться везде одинаково. В противном случае запускайте Eclipse в Linux или просто .class, который вы используете в Windows, так как в любом случае их не нужно перекомпилировать.

Кстати: вам не нужно импортировать Process.state, так как он не используется и находится в одном пакете (так что вам не понадобится, если вы это сделали)

...