javax vs pacote java

385

Qual é a lógica por trás do pacote javax? O que entra em java e o que em javax?

Sei que muitos pacotes corporativos-y estão em javax, mas o Swing também, a nova API de data e hora (JSR-310) e outros pacotes J2SE.

Jaka Jančar
fonte
3
JSR 310 em java.timeagora download.java.net/jdk8/docs/api/java/time/package-summary.html
Andrii Nemchenko
Um pacote opcional é uma implementação, uma API padrão aberto (exemplos de pacotes opcionais JavaServlet, Java3D). A maioria dos pacotes opcionais está enraizada no javax.*espaço para nome, embora possa haver exceções.
Sorte

Respostas:

212

Eu acho que é uma coisa histórica - se um pacote é introduzido como uma adição a um JRE existente, ele entra como javax. Se ele é introduzido pela primeira vez como parte de um JRE (como o NIO, acredito), ele entra como java. No javaxentanto, não sei por que a nova API de data e hora acabará seguindo esta lógica ... a menos que também esteja disponível separadamente como uma biblioteca para trabalhar com versões anteriores (o que seria útil). Nota de muitos anos depois: afinal, ele acabou sendo javaexibido.

Eu acredito que há restrições no javapacote - acho que os carregadores de classe estão configurados para permitir apenas ojava.* carregamento de classes dentro rt.jarou algo semelhante. (Certamente há um check-in ClassLoader.preDefineClass.)

EDIT: Embora uma explicação oficial (a pesquisa por orbfish sugerida não produza uma na primeira página) seja sem dúvida sobre "core" vs "extension", eu ainda suspeito que, em muitos casos, a decisão de qualquer pacote específico tenha uma razão histórica por trás disso também. É java.beansrealmente esse "núcleo" para Java, por exemplo?

Jon Skeet
fonte
7
Porque é mais fácil para um leitor pressionar alt-te digitar do que cortar e colar usando o iPad? ;). Você está certo, porém, acho que quis dizer download.oracle.com/javase/tutorial/ext/index.html . Sem ofensas, BTW Normalmente, acho suas respostas úteis. Estou surpreso que este foi aceito.
orbfish
11
O termo "javax" não aparece em nenhum lugar do link sugerido anteriormente neste tópico de comentários.
panfleto
A nova API de data e hora realmente acabou como java.timeafinal.
Michael Piefel
234

Originalmente javaxse destinava a extensões, e às vezes as coisas eram promovidas para o javaxjava.

Um problema foi o Netscape (e provavelmente o IE) limitando as classes que poderiam estar no pacote java.

Quando o Swing foi definido como "graduado", a javapartir javaxdaí houve uma espécie de mini-explosão, porque as pessoas perceberam que precisariam modificar todas as suas importações. Dado que a compatibilidade com versões anteriores é um dos principais objetivos do Java, eles mudaram de idéia.

Naquele momento, pelo menos para a comunidade (talvez não para a Sun) todo o ponto javaxestava perdido. Portanto, agora temos algumas coisas em javax que provavelmente deveriam estar java... mas, além das pessoas que escolheram os nomes dos pacotes, não sei se alguém pode descobrir qual é a lógica caso a caso.

TofuBeer
fonte
12
"Quando o Swing foi definido como" graduado "para javax a partir do javax, houve uma espécie de mini-explosão porque as pessoas perceberam que teriam que modificar todas as suas importações". As pessoas estavam reclamando de algo que poderia ser realizado com um regex que resultou do uso do código de qualidade pré-produção?
Sled
10
Sim. Eu escrevi uma ferramenta no Visual Cafe para converter entre os dois (javax e java) antes que a Sun decidisse mantê-la no pacote javax.
TofuBeer
51

javapacotes são base e javaxpacotes são extensões.

O swing era uma extensão porque o AWT era a API da interface do usuário original. Swing veio depois, na versão 1.1.

duffymo
fonte
Swing não fazia parte do 1.1. Havia uma versão do Swing que rodava na 1.1 como uma biblioteca.
Tom Hawtin # tackline
Existe a chave - "biblioteca", não parte do JDK. Eu tenho a versão errada? Meus javadocs sugerem que o JButton existe desde a versão 1.3, então talvez minha memória tenha me falhado.
duffymo
11
Então, por que a nova API de data e hora em javax .. data e hora não é "base"?
Pacerier 18/10/11
11
"... a nova API de data e hora (JSR-310) ..." - alguém da Oracle / Sun decidiu que era melhor colocar o javax, porque é uma extensão mais recente das bibliotecas principais. Se você não concorda, é melhor levá-lo com eles.
Duffymo 18/10
Apenas para referência: eles reverteram essa decisão e o JSR-310 foi colocado em java.time: docs.oracle.com/javase/8/docs/api/java/time/…
Mark Rotteveel
37

O namespace javax é geralmente (que é uma palavra carregada) usado para extensões padrão, atualmente conhecidas como pacotes opcionais . As extensões padrão são um subconjunto das APIs não principais; o outro segmento das APIs não principais obviamente chamava extensões não padrão, ocupando os espaços de nome como com.sun. * ou com.ibm. . As principais APIs utilizam o java. namespace.

Nem tudo no mundo da API Java começa no núcleo, e é por isso que as extensões geralmente nascem das solicitações JSR. Eles acabam sendo promovidos ao núcleo com base em 'conselhos sábios'.

O interesse nessa nomenclatura surgiu de um falso passo da parte da Sun - extensões poderiam ter sido promovidas para o núcleo, ou seja, movidas de javax. * Para java. * Quebrando a promessa de compatibilidade com versões anteriores. Os programadores choraram roucamente, e o melhor senso prevaleceu. É por isso que a API Swing, embora faça parte do núcleo, continua a permanecer no espaço para nome javax. *. E é assim também que os pacotes são promovidos das extensões ao núcleo - eles são simplesmente disponibilizados para download como parte do JDK e JRE.

Vineet Reynolds
fonte
2

Javax costumava ser apenas para extensões. Mais tarde, a Sun a adicionou à biblioteca java, esquecendo de remover o x. Os desenvolvedores começaram a criar código com javax. Mais tarde, os sóis decidiram alterá-lo para java. Os desenvolvedores não gostaram da ideia porque seu código seria arruinado ... então o javax foi mantido.

Miroslav
fonte
1

Os pacotes java. * são os principais pacotes da linguagem Java, o que significa que os programadores que usam a linguagem Java precisavam usá-los para fazer qualquer uso interessante da linguagem java.

Pacotes javax. * são pacotes opcionais, que fornecem uma maneira escalável e padrão de disponibilizar APIs personalizadas para todos os aplicativos em execução na plataforma Java.

Lakshmi Prasanna
fonte
0

Alguns pacotes, como javax.swingnão foram incluídos na biblioteca padrão java no início. A empresa Sun decidiu considerá-los oficiais e incluiu-os nas versões iniciais do java como bibliotecas padrão ou extensões padrão.

Por convenção, todas as extensões padrão começam com um Xtempo em que podem ser promovidas para a primeira classe ao longo do tempo, como aconteceu javax.swing.

m.r226
fonte