OpenJDK vs Oracle JDK
May 14, 2015
In the days of Java 6, there used to be a big difference between the two of them [OpenJDK and Oracle JDK], OpenJDK running slower and supporting less. However, nowadays, except for the java-web-plugin (…), they are exactly the same. - Link para resposta no AskUbuntu
O que me motivou a escrever este post foi o fato de que, ao ler esta afirmação, eu não tinha certeza do quanto ela estava certa. Pior, eu sequer sabia dizer qual era a história por trás do OpenJDK e qual sua relação com a JDK oficial da Oracle. Esta é uma compilação de tudo o que eu consegui encontrar durante esses dias sobre este assunto.
O início dos tempos
A história do surgimento do OpenJDK se entrelaça com a própria história do Java.
Desde o início da criação do Java, várias implementações livres foram feitas, mas no geral não continham todas as funcionalidades da versão oficial e eram significativamente mais lentas. Dentre elas, a mais importante foi o Apache Harmony anunciado em 2005, desenvolvido pela Apache Software Foundation. Ao que parece, o projeto nunca foi bem visto pela Sun que recusou por várias vezes reconhecer o Apache Harmony como uma das versões oficialmente compatíveis, por causa da violação de certas restrições impostas pela Sun pelo uso da marca. Mas apesar disso uma versão open source do Java 6 com 97% da especificação finalizada foi lançada.
No início de 2006, havia certo alvoroço sobre o futuro do Java. Na época, um ex-empregado da Sun publicou em seu blog uma carta (não respondida pela Sun) questionando os motivos de o Java continuar fechado:
We all know the standard Sun answer that Java will get fractured and that the JCP is great. However, OpenSolaris and OpenOffice have not been fractured since being open sourced. And most of the Java innovation nowadays comes from open source projects like Spring and Hibernate, not the JCP, which then has to recreate all of these open source projects. Some of the biggest supports of Java, including IBM and BEA and others in the JCP executive committee, have long asked for Java to be open sourced. So what’s up? Can you guys let go a bit and let us all share a single, open source virtual machine?
Então em 2006 a Sun — que até então era a detentora do Java — anunciou que o Java se tornaria open source, e a promessa foi cumprida em 2007, com o lançamento da versão 1.7. A versão do Java 6 foi liberada depois através de uma “reversão” dos commits:
The current plan is go “forward to the past” by starting with a near future build of JDK 7 and creating a backward branch that removes the changes inappropriate for a Java SE 6 implementation. The resulting code will be under the same GPLv2 license as JDK 7.
Em outubro de 2010, a IBM anunciou que se juntaria ao OpenJDK, o que acabou levando ao fim do Apache Harmony. Apesar disso, o Apache Harmony foi usado anos depois pela Google para criar a Dalvik no Android.
Então qual seria, hoje, a maior diferença entre a versão do JDK distribuída oficialmente nos repositórios das distribuições Linux e aquele oferecido pela Oracle?
De acordo com um artigo publicado durante o anúncio da transição para Open Source, embora não haja um pronunciamento oficial sobre quanto por cento do código da JDK da Oracle continuou fechado, a Sun admitiu que se tratava basicamente da tecnologia de gráficos 2D do Java, especialmente as partes de fontes e rasterização de imagens.
Resposta no Quora:
The Java2D pipeline on OpenJDK is less optimized and more buggy than on the Oracle (Sun) JDK. I think it has to do with various licenses that Oracle (Sun) has around anti-aliasing (and possible other parts of the pipeline) that aren’t licensed for OpenJDK. In one Java2D app running on OpenJDK I noticed some strange shape drawing at different affine transforms, almost as if there were precision errors.
E quanto ao “Open Source”?
Apesar de o OpenJDK ter tido o código-fonte liberado e estar sob uma licença open source (GPLv2) isso não significa que a plataforma ofereça as mesmas liberdades de um projeto open source. Basicamente, fazer um fork do OpenJDK significa que você e quem quer que use seu projeto poderão ser processados por violação de patentes (há muitas patentes no código do OpenJDK) por quem quer que tenha contribuído para o projeto. O único jeito de conseguir direitos sobre as patentes é passar no kit de compatibilidade da Oracle, o TCK. Porém, para passar nos testes, você precisa aceitar certos “field-of-use restrictions”. Em suma, você não tem permissão para usar a tecnologia em dispositivos embarcados. O problema é que aceitar tais restrições significa que você e seus usuários podem ser processados por violação da GPL.
Vale lembrar que o OpenJDK também inclui algo chamado ClassPath Exception, uma extenção da GPL que permite a usuários da plataforma lançarem suas aplicações com código fechado e ainda assim fazerem uso da biblioteca padrão do Java.
Conclusão
Espero que este texto ajude qualquer um a entender a história por trás do OpenJDK e qual sua relação com a versão distribuída pela Oracle. Eu não tive muito tempo para pesquisar certas nuances de cada tópico, pois isso daria material para muitos posts. Mas sinta-se a vontade para indicar artigos ou informações que poderiam melhorar este post. Obrigado.