Código-fonte de arquivo único Java 11

Código-fonte de arquivo único Java 11

1. Introdução

JDK 11, que é a implementação do Java SE 11, lançado em setembro de 2018.

Neste tutorial, abordaremos o novo recurso Java 11 de lançamento de programas de código-fonte de arquivo único.

2. Antes do Java 11

Um programa de arquivo único é aquele em que o programa se encaixa em um único arquivo de origem.

Antes do Java 11, mesmo para um programa de arquivo único, tivemos que seguir um processo de duas etapas para executar o programa.

Por exemplo, se um arquivo chamadoHelloWorld.java contém uma classe chamadaHelloWorld com um métodomain(),we would have to first compile it:

$ javac HelloWorld.java

Isso geraria um arquivo de classe quewe would have to run using the command:

$ java HelloWorld
Hello Java 11!

Esses programas são padrão nos estágios iniciais do aprendizado de Java ou na gravação de pequenos programas utilitários. Neste contexto, é um pouco cerimonial ter que compilar o programa antes de executá-lo.

But, wouldn’t it be great to just have a one-step process instead? Java 11 tenta resolver isso, permitindo-nos executar tais programas diretamente da fonte.

3. Lançar programas de código-fonte de arquivo único

A partir do Java 11, podemos usar o seguinte comando para executar um programa de arquivo único:

$ java HelloWorld.java
Hello Java 11!

Observe como passamos o nome do arquivo do código-fonte Java e não a classe Java para o comandojava.

A JVM compila o arquivo de origem na memória e, em seguida, executa o primeiro método públicomain() que encontra.

Obteremos erros de compilação se o arquivo de origem contiver erros, mas caso contrário, ele será executado como se já o tivéssemos compilado.

4. Opções de linha de comando

O iniciador Java introduziu um novosource-file mode para oferecer suporte a esse recurso. O modo de arquivo de origem é ativado se uma das duas condições a seguir for verdadeira:

  1. O primeiro item na linha de comando seguido pelas opções JVM é um nome de arquivo com a extensão.java

  2. A linha de comando contém a opção de versão–source

If the file does not follow the standard naming conventions for Java source files, we need to use the –source option. Falaremos mais sobre esses arquivos na próxima seção.

Any arguments placed after the name do arquivo de origem na linha de comando original são passados ​​para a classe compilada quando ela é executada.

Por exemplo, temos um arquivo chamadoAddition.java que contém uma classeAddition. Esta classe contém um métodomain() que calcula a soma de seus argumentos:

$ java Addition.java 1 2 3

Além disso, podemos passar opções como–class-path antes do nome do arquivo:

$ java --class-path=/some-path Addition.java 1 2 3

Agora,we’ll get an error if there is a class on the application classpath with the same name as the class we are executing.

Por exemplo, digamos que em algum ponto durante o desenvolvimento, compilamos o arquivo presente em nosso diretório de trabalho atual usandojavac:

$ javac HelloWorld.java

Agora temosHelloWorld.java and HelloWorld.class presentes no diretório de trabalho atual:

$ ls
HelloWorld.class  HelloWorld.java

Mas, se tentarmos usar o modo de arquivo de origem, obteremos um erro:

$ java HelloWorld.java
error: class found on application class path: HelloWorld

5. Arquivos Shebang

É comum em sistemas derivados do Unix, como macOS e Linux, usar o "#!" diretiva para executar um arquivo de script executável.

Por exemplo, um script de shell geralmente começa com:

#!/bin/sh

Podemos então executar o script:

$ ./some_script

Esses arquivos são chamados de "arquivos shebang".

Agora podemos executar programas de arquivo único Java usando esse mesmo mecanismo.

Se adicionarmos o seguinte ao início de um arquivo:

#!/path/to/java --source version

Por exemplo, vamos adicionar o seguinte código em um arquivo chamadoadd:

#!/usr/local/bin/java --source 11

import java.util.Arrays;

public class Addition
{
    public static void main(String[] args) {
        Integer sum = Arrays.stream(args)
          .mapToInt(Integer::parseInt)
          .sum();

        System.out.println(sum);
    }
}

E marque o arquivo como executável:

$ chmod +x add

Em seguida, podemos executar o arquivo como um script:

$ ./add 1 2 3
6

Também podemos usar explicitamente o iniciador para chamar o arquivo shebang:

$ java --source 11 add 1 2 3
6

The –source option is required even if it’s already present in the file. O shebang no arquivo é ignorado e é tratado como um arquivo java normal sem a extensão.java.

No entanto,, we can’t treat a .java file as a shebang file, even if it contains a valid shebang. Portanto, o seguinte resultará em um erro:

$ ./Addition.java
./Addition.java:1: error: illegal character: '#'
#!/usr/local/bin/java --source 11
^

Uma última coisa a observar sobre os arquivos shebang é que a diretiva torna o arquivo dependente da plataforma. The file will not be usable on platforms like Windows, which does not natively support it.

6. Conclusão

Neste artigo, vimos o novo recurso de código-fonte de arquivo único introduzido no Java 11.

Como de costume, trechos de código podem ser encontradosover on GitHub.