Compilando arquivos Java *.class com javac

Compilando arquivos Java *.class com javac

===* 1. Visão geral *

Este tutorial apresentará a ferramenta javac e descreve como usá-la para compilar arquivos de origem Java em arquivos de classe.

Começaremos com uma breve descrição do comando javac e, em seguida, examinaremos a ferramenta mais detalhadamente, examinando suas várias opções.

===* 2. O comando javac *

Podemos especificar opções e arquivos de origem ao executar a ferramenta javac:

javac [options] [source-files]

Onde _ [opções] _ indica as opções que controlam as operações da ferramenta e _ [arquivos de origem] _ indica um ou mais arquivos de origem a serem compilados.

Todas as opções são realmente totalmente opcionais. Os arquivos de origem podem ser especificados diretamente como argumentos para o comando javac ou mantidos em um arquivo de argumentos referenciado, conforme descrito posteriormente. Observe que os arquivos de origem devem ser organizados em uma hierarquia de diretórios correspondente aos nomes totalmente qualificados dos tipos que eles contêm.

As opções de javac são categorizadas em três grupos: padrão, compilação cruzada e extra. Neste artigo, focaremos nas opções padrão e extras.

As opções de compilação cruzada são usadas no caso de uso menos comum de compilar definições de tipo em uma implementação da JVM diferente do ambiente do compilador e não serão abordadas.

===* 3. Definição de tipo *

Vamos começar apresentando a classe que vamos usar para demonstrar as opções javac:

public class Data {
    List<String> textList = new ArrayList();

    public void addText(String text) {
        textList.add(text);
    }

    public List getTextList() {
        return this.textList;
    }
}

O código fonte é colocado no arquivo com//javac/Data.java.

Observe que usamos os separadores de arquivos* nix neste artigo; em máquinas Windows, devemos usar a barra invertida (‘_ \ '_) em vez da barra invertida (‘ _/' _).

*4. Opções padrão *

Uma das opções padrão mais usadas do comando javac é -d,* especificando o diretório de destino para os arquivos de classe gerados *. Se um tipo não faz parte do pacote padrão, uma estrutura de diretórios que reflete o nome do pacote é criada para manter o arquivo de classe desse tipo.

Vamos executar o seguinte comando no diretório que contém a estrutura fornecida na seção anterior:

javac -d javac-target com//javac/Data.java

O compilador javac irá gerar o arquivo de classe javac-target/com//javac/Data.class. Observe que em alguns sistemas, javac não cria automaticamente o diretório de destino, que é javac-target nesse caso. Portanto, podemos precisar fazer isso manualmente.

Aqui estão algumas outras opções usadas com freqüência:

  • - cp (ou -classpath, _ – class-path_) - especifica onde os tipos necessários para compilar nossos arquivos de origem podem ser encontrados. Se essa opção estiver ausente e a variável de ambiente CLASSPATH não estiver configurada, o diretório de trabalho atual será usado (como foi o caso no exemplo acima).

  • - p (ou _ – module-path_) - indica a localização dos módulos de aplicativos necessários. Esta opção é aplicável apenas ao Java 9 e superior - consulte o link:/project-jigsaw-java-modularity [este tutorial] para obter um guia para o sistema de módulos Java 9.

Se quisermos saber o que está acontecendo durante um processo de compilação, por exemplo, quais classes são carregadas e quais são compiladas, podemos aplicar a opção -verbose.

A última opção padrão que abordaremos é o arquivo de argumento. Em vez de passar argumentos diretamente para a ferramenta javac, podemos armazená-los em arquivos de argumentos . Os nomes desses arquivos, prefixados com o caractere ‘@ , são usados ​​como argumentos de comando.

Quando o comando javac encontra um argumento começando com ‘@ , ele interpreta os seguintes caracteres como o caminho para um arquivo e expande o conteúdo do arquivo em uma lista de argumentos. Espaços e caracteres de nova linha podem ser usados ​​para separar argumentos incluídos em um arquivo de argumento.

Vamos supor que temos dois arquivos, denominados options e types, no diretório javac-args com o seguinte conteúdo:

O arquivo options:

-d javac-target
-verbose

O arquivo types:

com//javac/Data.java

Podemos compilar o tipo Data como antes, com mensagens detalhadas impressas no console, executando este comando:

javac @javac-args/options @javac-args/types

Em vez de manter argumentos em arquivos separados, também podemos armazená-los em um único arquivo .

Suponha que exista um arquivo chamado arguments no diretório javac-args:

-d javac-target -verbose
com//javac/Data.java

Vamos alimentar este arquivo com javac para obter o mesmo resultado que com os dois arquivos separados antes de :

javac @javac-args/arguments

Observe que as opções pelas quais passamos nesta seção são apenas as mais comuns. Para obter uma lista completa das opções javac padrão, consulte https://docs.oracle.com/javase/9/tools/javac.htm#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9__STANDARDOPTIONSFORJAVAC-7D3D9CC2 nesta referência].

*5. Opções extras *

Opções extras de javac são opções não padrão, específicas da implementação atual do compilador e podem ser alteradas no futuro. Como tal, não examinaremos essas opções em detalhes.

No entanto, existe uma opção que é muito útil e vale a pena mencionar, -Xlint. Para obter uma descrição completa das outras opções extras do javac, siga https://docs.oracle.com/javase/9/tools/javac.htm#GUID-AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9__NONSTANDARDOPTIONSFORJAVAC-7D3DAA9D Cleveland.

*A opção _-Xlint_ nos permite ativar avisos durante a compilação* . Há duas maneiras de especificar esta opção na linha de comando:
  • - Xlint – aciona todos os avisos recomendados

  • - Xlint: key [, key]