Estou tendo problemas para entender como os pacotes funcionam. Não usando nenhum IDE.
Eu tenho a seguinte estrutura de pastas: ~/dropbox/api/data
Dentro da pasta de dados , existem (apenas) Producer.java , Consumer.java .
api
├── data
├── Consumer.java
├── Producer.java
└── Producer.class
package data;
public class Producer {
public static void main(String[] args) {
//do some production
}
public static Producer getProducer() {
//call constructor and return instance
}
}
----------------
package data;
public class Consumer {
public static void main(String[] args) {
Producer worker = getProducer();
}
}
I cd
para a pasta de dados e javac Producer.java
compilar Producer.class na mesma pasta. Então, quando executo java Producer
, recebo Error: Could not find or load main class Producer Caused by: java.lang.NoClassDefFoundError: Producer (wrong name: data/Producer) .
O mesmo erro, quando tentei java Producer
na pasta java data.Producer
pai api
e java data.Producer
na data
pasta.
- O que há de errado aqui? Se eu remover o
package data;
, ele compila (javac) e executa (java) perfeitamente na pasta de dados .
Além disso, quando tentei javac Consumer.java
, recebi o erro: não consigo encontrar o símbolo Producer . Eles estão na mesma pasta e declararam o mesmo pacote.
- O que há de errado aqui?
O
java
comando requer que você especifique o nome completo da classe. Então,java Producer
nunca funcionará; você deve digitarjava data.Producer
.Mas isso não é tudo.
O pacote segue dir. Portanto, quando você digita
java data.Producer
como deve, o java tenta carregardata/Producer.class
a partir de cada entrada no caminho de classe. Por padrão, o diretório atual está no caminho de classe, mas se você estiver mexendo, por exemplo, naCLASSPATH
variável de ambiente, talvez não esteja. Para ter certeza de que esse não é o problema,java -cp . data.Producer
.Não, você estragou tudo de alguma forma.
java data.Producer
da pasta api funcionará. Só para ter certeza, tentejava -cp . data.Producer
(e se funcionar , desfaça o que quer que você tenha bagunçado com aCLASSPATH
variável. Ou apenas se acostume a fazer isso, não é uma má ideia).Mesmo problema, você precisa executar
javac data/Consumer.java
a partir do diretório da API.Há um motivo pelo qual você não usa
javac
diretamente e, em vez disso, usa uma ferramenta de construção ou IDE.