Pessoal, estou com um probleminha aqui, estou estudando java e não quero usar IDE pois meus estudos é justamente para a prova de certificação. Estou usando o Sublime, e gostaria de organizar meus codigos da forma em que ficam organizados em uma IDE, Projeto > Pacotes > Classes O Sublime até permite criar o projeto, mas não tem a função de criar pacotes para organizar as classes (Pelo menos eu acho que não) eu tentei criar manualmente as pastas me espelhando na pasta de um projeto que fiz no eclipse, crei as pastas assim Nome_Projeto >> src >> Nome_Pacote >> Classes Mas quando declaro que minha classe pertence ao Package Nome_Pacote; O compilador acusa que não encontrou a classe principal, ai quando eu tiro a declaração do pacote compila de boas. Alguém pode me ajudar nisso ae ? Agradeço !!
Pacotes não existem fisicamente, são uma abstração às pastas. Por isso o Sublime não tem uma função nativa para a criação de pacotes.
O compilador não faz questão de que haja uma classe principal. A JVM sim, na hora da execução. O que pode estar acontecendo é que você está tentando inicializar a JVM passando sua classe com o método main
sendo que ela não está visível no classpath.
Fiz um exemplo aqui. Estou na pasta raiz do projeto pelo bash. Tenho 2 classes, Pessoa
e Main
. A estrutura de pastas é:
src/main/java/com/lvbarbosa/guj/[classes].java
package com.lvbarbosa.guj;
class Pessoa {
private final String nome;
Pessoa(String nome) {
this.nome = nome;
}
void dizerOi() {
System.out.println("Oi, eu sou o " + nome);
}
}
package com.lvbarbosa.guj;
class Main {
public static void main(String[] args) {
new Pessoa("Lucas").dizerOi();
}
}
Para compilar, partindo da pasta raiz do projeto:
javac -cp src/main/java src/main/java/com/lvbarbosa/guj/Main.java -d build/classes
Esse comando vai compilar a classe Main
e todas as classes às quais ela faz referência (Pessoa
, nesse caso) e jogar os .class
no diretório build/classes
(que já deve ter sido criado previamente) com a devida estrutura de pastas (obedecendo aos nomes dos pacotes).
Para executar, dá raiz do projeto:
java -cp build/classes com.lvbarbosa.guj.Main
A estrutura de arquivos final fica assim:
.
├── build
│ └── classes
│ └── com
│ └── lvbarbosa
│ └── guj
│ ├── Main.class
│ └── Pessoa.class
└── src
└── main
└── java
└── com
└── lvbarbosa
└── guj
├── Main.java
└── Pessoa.java
Vlw mano, esclarecu muito coisa, so não entendi muito bem os comandos que você usou para compilar e executar
Ficou show mano !! Rodou blz aqui so te peço pra me explicar melhor as linhas de comando, eu até entendi que assim que o arquivo seja compilado o arquivo .class sera movido para a pasta build/classes mas não peguei muito bem a logica do comando não, sou meio noob ainda nessas parada. Agradeço !![quote=“lvbarbosa, post:2, topic:351677”]
Para compilar, partindo da pasta raiz do projeto:
javac -cp src/main/java src/main/java/com/lvbarbosa/guj/Main.java -d build/classes
Esse comando vai compilar a classe Main e todas as classes às quais ela faz referência (Pessoa, nesse caso) e jogar os .class no diretório build/classes (que já deve ter sido criado previamente) com a devida estrutura de pastas (obedecendo aos nomes dos pacotes).
Para executar, dá raiz do projeto:
java -cp build/classes com.lvbarbosa.guj.Main
[/quote]
-
javac
= Java Compiler, é o programa que lê os.java
e gera o bytecode para ser executado na JVM, os.class
; -
-cp valor[;valor...]
= flag que indica aojavac
o que deve ser incluído no Classpath. Nesse caso, queremos que tudo dentro do caminhosrc/main/java
esteja disponível. O valor padrão do classpath é o diretório atual. O valor pode ser um diretório, arquivo.zip
, arquivo.jar
ou arquivo.class
, e você separa múltiplos valores com;
. -
-d
: indica aojavac
aonde escrever o bytecode gerado. Por padrão, cada arquivo.class
gerado vai ficar na mesma localização do arquivo.java
que deu origem a ele. Quando você especifica um diretório com essa flag, ojavac
vai recriar a estrutura de diretórios (seguindo os nomes dos pacotes) e colocar os.class
lá, separado dos arquivos.java
. -
java
: invoca a JVM; -
-cp
: mesma coisa do-cp
dojavac
, indica o que deve estar disponível no Classpath de execução; -
com.lvbarbosa.guj.Main
: nome da classe que a JVM deve invocar o métodopublic static void main(String[] args)
.
Muito obrigado mano !!
Excelente explicação, só me tira uma duvida, toda vez que eu compilar, ele vai gerar um novo arquivo.class, ou ele vai recompilar o já existente?