Como criar o Projeto e pacotes pelo sublime

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
3 curtidas

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 ao javac o que deve ser incluído no Classpath. Nesse caso, queremos que tudo dentro do caminho src/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 ao javac 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, o javac 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 do javac, 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étodo public static void main(String[] args).
3 curtidas

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?