quinta-feira, 20 de março de 2014

Festa de lançamento do Java 8





O Java 8 já está disponível e para comemorar, no dia 25 de março, será celebrado o seu lançamento.
No período da tarde, 14 horas no horário de Brasília, haverá um WebCast online para todo o mundo.
Faça sua inscrição no site do evento.
Site do evento: Aqui
Fonte: Clique Aqui
Também haverá a festa de lançamento pela equipe do SouJava no mesmo dia 19 horas, o evento acontecerá presencialmente pela Global Code e transmitido para todo o Brasil.
  • Local: Global Code São Paulo/ Online
  • Endereço: Avenida Bernardino de Campos, 327, São Paulo - SP, 04004-050
  • Horário: 19:00
  • Inscrições: http://goo.gl/OlRKAZ
Obs.: Caso opte pela inscrição online o link para transmissão será enviada por e-mail e divulgado no twitter do SouJava 10 minutos antes da transmissão.

Confira abaixo a programação:

  • Título: O projeto OpenJDK
  • Descrição: O OpenJDK é um projeto da JVM baseado totalmente em software livre e de código aberto. Começou a ficar mais conhecido na versão anterior, Java 7, por se tornar a implementação de referência. Esse projeto tem apoio de várias empresas e comunidades, conheça um pouco mais sobre o projeto e as novas funcionalidades que vão além das JSRs no Java 8. Além dos próximos passos no Java 9.
  • Palestrante: Bruno Souza
  • Mini-Bio: Bruno Souza é Presidente do SouJava. Conhecido como o "JavaMan", é evengelista Java e open source, e trabalhou na criação e fortalecimento de comunidades em toda sua carreira. Foi diretor mundial de Comunidades Open Source, coordenou importantes comunidades como NetBeans e OpenSolaris e ajudou a criar a Comunidade Mundial de Grupos de Usuários Java. Desenvolvedor Java desde os primórdios da tecnologia, participou de alguns dos maiores projetos Java do país, e realizou centenas de apresentações em todo o mundo. Bruno é também Diretor da Open Source Initiative (OSI), onde discute a evolução do movimento open source.Quando não está em um computador, Bruno curte o seu tempo com a família em um pequeno esconderijo próximo a São Paulo. Amador em varias atividades -- fotografia, fantoches, pai -- ele tenta ter sucesso em algumas delas.
  • Palestrante: Otávio Santana
  • Mini-Bio: Desenvolvedor entusiasta do mundo Open-Source. Praticante da filosofia ágil e do desenvolvimento poliglota na Bahia, JUG Leader do JavaBahia, membro do SouJava, um dos fomentadores do grupo LinguÁgil. Presente nos maiores eventos Java e ágil em nível nacional, contribui para o projeto openjdk e a plataforma JSE, criador do Apache Easy-Cassandra, presente na comunidade Java mundial além de escrever artigos para DevMedia, revista espírito livre e java.net

  • Título: Novidades do Java 8
  • Descrição: Java Is Back - o Java 8 disponibiliza uma série de funcionalidades com destaque maior para Lambda, Type Annotations, motor JS Nashorn e nova API para manipular Data e Hora.
  • Palestrante: Eder Magalhaes
  • Mini-bio: Trabalha profissionalmente com desenvolvimento de sistemas desde 2000. Atuou com diversas tecnologias, destaque para Java, no desenvolvimento de soluções para os segmentos: logística, call center, bancário, e-commerce, educacional. Instrutor da Globalcode desde 2006, aonde já ministrou mais 3000 horas-aula.

  • Título: Java Next (o futuro do Java SE e Java EE)
  • Descrição: Nesses dois últimos anos tivermos o lançamento das duas principais plataformas do mundo Java, SE e EE, conheça um pouco mais sobre elas além dos próximos passos das plataformas mais utilizadas no mundo.
  • Palestrante: Bruno Borges
  • Mini-Bio: Gerente de Produtos da Oracle na linha Java EE como GlassFish e WebLogic, é profissional da área há 10 anos. Atuou em empresas como EDS/HP, CETIP, Summa e Neociclo. Desenvolveu softwares e soluções em padrões de integração (EIPs), web e Android. Participante de comunidades de software livre incluindo a Apache Software Foundation e contribui para projetos open source da ASF.

terça-feira, 18 de março de 2014

Nova versão do Java SE disponível [JDK 1.8]




Pessoal já está disponível a nova versão do Java SE, o java 8.
Para fazer o Download do HotSpot baixar aqui:
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Curioso para ver o código fonte [OpenJDK]:  http://hg.openjdk.java.net/jdk8/jdk8

Para conhecer mais as novidades do Java 8, acesse:





Haverá também uma festa de lançamento no dia 25 de março, terça-feira às 14 horas, no horário de Brasília, e as inscrições para o WebCast já estão abertas.

Faça sua inscrição no site do evento.

site do evento: http://eventreg.oracle.com/profile/web/index.cfm?PKWebId=0x637279c68
Fonte: http://soujava.org.br/?p=1374&shareadraft=531eefd3ae303


Também haverá a festa de lançamento pela equipe do SouJava no mesmo dia 19 horas, em breve mais informações.

Os trabalhos para o Java 9 já começaram, dentre os novos recursos que se esperam podemos destacar a JSR 294, para modularizarão do JDK com Jigsaw, e a JSR 354, api de de dinheiro e moeda.

código fonte do JDK 9 [OpenJDK]: http://hg.openjdk.java.net/jdk9/jdk9

quarta-feira, 5 de fevereiro de 2014

Nova lista de discussão do OpenJDK



Nova lista de discussão criada dentro do projeto OpenJDK, como o nome já diz a ideia é estar falando um pouco mais sobre a divulgação do projeto e maneiras de ajudar o mesmo.
Para se inscrever: http://mail.openjdk.java.net/mailman/listinfo/adoption-discuss

terça-feira, 4 de fevereiro de 2014

JDK 1.9: JPE 192 e a morte do java 1.5

Para reduzir o custo de manutenção do compilador java, javac, essa melhoria define a politica para "morte" do código antigo. No java 9 o jdk 1.5 será depreciado e o seu suporte será removido. O javac usará a política de uso "uma mais três atrás". Por exemplo, no Java 10 será removido o suporte para o 6 (10 - 4 = 6) e assim por diante.

Objetivo

Reduzir o custo de manutenção do compilador removendo o código obsoleto.

Motivação

Removendo a opção de código antigo, a manutenção do javac será simplificado.

Descrição

Os código do 1.5 serão depreciados no Java 8. No Java 9 será removido, e essa política será continuada no JDK 10.
Vale lembrar que a nova versão do JDK, java 8, sairá em março, mesmo sem o lançamento o trabalho para o Java 9 já começou.
Fonte: http://openjdk.java.net/jeps/182
JDK 1.9: http://hg.openjdk.java.net/jdk9/jdk9

quarta-feira, 29 de janeiro de 2014

Como compilar código Java dinâmicamente

O Java é uma plataforma que se multiplicou exponencialmente, uma de sua grande vantagem é o fato de que você consegue com o mesmo código executar em diferentes plataformas, com isso se pode programar para servidor, dispositivos embarcados, desktop, etc. com a mesma linguagem. Além disso a JVM possui suporte para diversas linguagens, das quais possuem, diversas características e recursos interessantes. Um mito que existe é que o Java não compila em tempo de execução, o que faz muitas pessoas utilizem uma linguagem dinâmica, apenas por esse objetivo, mas será que isso é verdade?

Possuir uma linguagem dinâmica é muito interessante para alguns projetos específicos, por exemplo, quando se faz um projeto que realiza calculo tributário, como essa fórmula mudam muito ao ano e variam de município para município, nesse caso é melhor que o código fonte esteja em um banco de dados, por exemplo, para quando for necessário modificar o calculo não seja necessário compilar todo o código fonte e fazer o deploy, correndo o risco do sistema ficar fora do ar mesmo que por alguns instantes.

Sim é possível em Java compilar códigos dinamicamente. Na verdade isso é muito comum do que imaginamos! Por exemplo, o Hibernate para gerenciar das entidades, para facilitar ainda o seu uso a partir da versão 1.6 com a JSR 199 foi criada um API com essa finalidade.

Para demonstrar essa funcionalidade será usado a solução para o problema acima, fazer com que haja troca de fórmula, para facilitar a demonstração e focar na solução serão as 4 operações básicas, sendo que esse código fonte estará no banco de dados, no caso será simulado com arquivos dentro de um txt. Como não podemos referenciar uma classe não compilada, criaremos uma interface Operação, ela será implementada por nossas classes que estarão em nosso “banco de dados”.

public interface Calculo { 

 Double calcular(Number valorA, Number valorB);  
  
} 

Interface na qual será utilizada como referencias as classes compiladas dinamicamente.

Explicando o processo de compilação passo a passo: A classe JavaCompiler, que tem a responsabilidade de fazer a compilação do código-fonte. A chamada ToolProvider.getSystemJavaCompiler() retorna este objeto. Se um compilador Java não estiver disponível, o retorno será null. Ele conta com o método getTask(), que retorna um objeto CompilationTask. De posse desse objeto, a chamada call() efetua a compilação do código e retorna um booleano indicando se ela foi feita com sucesso (true) ou se houve falha (false).

public class JavaDinamicoCompilador { 
 
  private JavaCompiler compiler; 

  private JavaDinamicoManager javaDinamicoManager; 

  private JavaDinamicoClassLoader classLoader; 

  private DiagnosticCollector diagnostics; 

  public JavaDinamicoCompilador() throws JavaDinamicoException { 
    compiler = ToolProvider.getSystemJavaCompiler(); 
    if (compiler == null) { 
     throw new JavaDinamicoException("Compilador não encontrado"); 
    } 

    classLoader = new JavaDinamicoClassLoader(getClass().getClassLoader()); 
    diagnostics = new DiagnosticCollector(); 

    StandardJavaFileManager standardFileManager = compiler 
        .getStandardFileManager(diagnostics, null, null); 
    javaDinamicoManager = new JavaDinamicoManager(standardFileManager, classLoader); 
  } 

  @SuppressWarnings("unchecked") 
  public synchronized Class compile(String packageName, String className, 
      String javaSource) throws JavaDinamicoException 
  { 
    try { 
      String qualifiedClassName = JavaDinamicoUtils.INSTANCE.getQualifiedClassName( 
          packageName, className); 
      JavaDinamicoBean sourceObj = new JavaDinamicoBean(className, javaSource); 
      JavaDinamicoBean compiledObj = new JavaDinamicoBean(qualifiedClassName); 
      javaDinamicoManager.setSources(sourceObj, compiledObj); 

      CompilationTask task = compiler.getTask(null, javaDinamicoManager, diagnostics, 
          null, null, Arrays.asList(sourceObj)); 
      boolean result = task.call(); 

      if (!result) { 
       throw new JavaDinamicoException("A compilação falhou", diagnostics); 
    } 

      Class newClass = (Class) classLoader.loadClass(qualifiedClassName); 
      return newClass; 

    } 
    catch (Exception exception) { 
      throw new JavaDinamicoException(exception, diagnostics); 
    } 
  } 
}
Classe responsável pela compilação

O processo de compilação envolve dois tipos de arquivos: os códigos-fonte escritos em Java e os arquivos compilados (bytecodes). Na Compiler API estes arquivos são representados por objetos de uma única interface, chamada JavaFileObject. Felizmente a API disponibiliza uma classe que implementa esta interface, chamada SimpleJavaFileObject e, na escrita de código de compilação dinâmica, deve-se criar uma subclasse de SimpleJavaFileObject e sobrescrever os métodos necessários.
public class JavaDinamicoBean extends SimpleJavaFileObject { 

  private String source; 

  private ByteArrayOutputStream byteCode = new ByteArrayOutputStream(); 

 
  public JavaDinamicoBean(String baseName, String source) { 
    super(JavaDinamicoUtils.INSTANCE.createURI(JavaDinamicoUtils.INSTANCE.getClassNameWithExt(baseName)), 
        Kind.SOURCE); 
    this.source = source; 
  } 
  
  public JavaDinamicoBean(String name) { 
    super(JavaDinamicoUtils.INSTANCE.createURI(name), Kind.CLASS); 
  } 

  @Override 
  public String getCharContent(boolean ignoreEncodingErrors) { 
    return source; 
  } 

  @Override 
  public OutputStream openOutputStream() { 
    return byteCode; 
  } 

  public byte[] getBytes() { 
    return byteCode.toByteArray(); 
  } 
}
Estrutura de dados que contem o codigo fonte e a classe compilada

Para representar os arquivos envolvidos será utilizado o ForwardingJavaFileManager que implementa a interface JavaFileManager.

public class JavaDinamicoManager extends ForwardingJavaFileManager { 
  private JavaDinamicoClassLoader classLoader; 
  
 
  private JavaDinamicoBean codigoFonte; 
 
  private JavaDinamicoBean arquivoCompilado; 
  
  public JavaDinamicoManager(JavaFileManager fileManager, JavaDinamicoClassLoader classLoader) 
  { 
    super(fileManager); 
    this.classLoader = classLoader; 
  } 

  public void setSources(JavaDinamicoBean sourceObject, JavaDinamicoBean compiledObject) { 
    this.codigoFonte = sourceObject; 
    this.arquivoCompilado = compiledObject; 
    this.classLoader.addClass(compiledObject); 
  } 

  @Override 
  public FileObject getFileForInput(Location location, String packageName, 
      String relativeName) throws IOException 
  { 
    return codigoFonte; 
  } 

  @Override 
  public JavaFileObject getJavaFileForOutput(Location location, 
      String qualifiedName, Kind kind, FileObject outputFile) 
      throws IOException 
  { 
    return arquivoCompilado; 
  } 

  @Override 
  public ClassLoader getClassLoader(Location location) { 
    return classLoader; 
  } 
}
Classe responsável por gerenciar as classes compiladas e não compiladas

Para que ela possa ser utilizada, a JVM deve ser capaz de reconhecê-la como uma classe da aplicação, a fim de que possa carregá-la quando chegar o momento. O componente responsável pelo carregamento das classes das aplicações Java durante a execução é o Class Loader.
Portanto, para que a JVM saiba da existência das novas classes compiladas, é necessário implementar um class loader customizado, que fica atrelado ao gerenciador de arquivos.
Ele deve estender a classe ClassLoader (do pacote java.lang) e tem a responsabilidade de carregar as classes recém-criadas.
Com isso foi discutido um pouco sobre a compilação dinâmica do Java no Java, objetivo aqui foi apenas de demonstrar o seu funcionamento básico além de uma pequena explicação do uso da API. Pela sua complexidade o ideal é que ela esteja encapsulado a ponto de ser utilizadas várias vezes em diversos projetos. O objetivo aqui não foi desmerecer em nenhum momento as outras linguagens de programação rodando ou não em cima da JVM, afinal todas elas têm sua importância. O objetivo foi demonstrar que não existe a necessidade de mudar de linguagem caso seu problema seja ter um código que seja compilado dinamicamente.


Referências:

segunda-feira, 26 de agosto de 2013

Imergindo na JVM



Com o intuito de divulgar a JVM e o projeto OpenJDK aqui no Brasil, foi feito um pequeno Ebook com o objetivo de falar do funcionamento interno da JVM e como compilar a JVM.
Mais informações:
Certamente o Java é atualmente uma das linguagens mais usadas e uma das mais populares no mundo, sendo que os seus maiores diferenciais não estão na linguagem e sim na JVM (Máquina virtual Java). Conheça um pouco mais sobre esse motor, seu funcionamento e sua arquitetura para tirar melhor proveito dela em suas aplicações, além de conhecer um pouco sobre a implementação de referência e open source da JVM, o OpenJDK. O conteúdo desse E-book falará sobre:
 
  • os registradores da JVM
  • A interface do Java com código nativo, JNI, presente em diversos pontos do JVM, dentre eles, o NIO e Gargabe Collector,
  • O funcionamento básico do Garbage Collector
  • Como compilar o OpenJDK 
  • ByteCode e o seu funcionamento
  • E muito mais!
Qualquer erro que encontrarem, se puderem e quiserem reportar, por favor, envie um email para: otaviojava@java.net
Ele será gratuito e entregue a comunidade Java Brasileira, assim você também estará contribuindo.