Restrição de acesso na classe devido a restrição na biblioteca necessária rt.jar?

824

Estou tentando compilar o código Java 1.4 que foi criado pelo WSDL2Java da IBM no Java5 sem recriar os stubs e vi esse erro no Eclipse . Estou no pressuposto de que os stubs gerados devem ser compilados apenas enquanto o tempo de execução estiver disponível (eles estão).
jars

Access restriction: The type QName is not accessible due to restriction on required library C:\Program Files\Java\jdk1.5.0_16\jre\lib\rt.jar

O nome completo da classe é javax.xml.namespace.QName

O que exatamente está acontecendo aqui? É este o caso em que estou tentando refatorar um porco da linguiça? É melhor recriar os stubs?

sal
fonte
1
Eu não entendo, por que você não apenas compila em outro lugar e executa no seu ambiente 1.4 (então eu acho)?
Tim Büthe
O ambiente de destino eventual é o jboss4.2 no jdk5.
Sal
2
Sobre o status de "protegido": Em StackOverflow Nada diz "Obrigado" ou "eu também" como um upvote;)
OscarRyz
6
Veja a grande resposta Mais votada ... Ignore 96% do restante desta página. Pesquisa: "Nels Beckman", 1 de fevereiro de 2010 às 04:09
será
1
O que funcionou para mim foi editar / alterar a Biblioteca do sistema JRE do ambiente Execution (ou padrão do espaço de trabalho) para JRE alternativo (selecionei a mesma versão Java). Você também deve garantir (1) a ordem correta na guia Ordem e exportação , (2) o nível de conformidade correto nas configurações do Java Compiler (o mesmo que a versão Java selecionada).
ADTC

Respostas:

1884

Há outra solução que também funciona.

  1. Vá para as configurações do caminho de construção nas propriedades do projeto.
  2. Remova a biblioteca do sistema JRE
  3. Adicione de volta; Selecione "Adicionar Biblioteca" e selecione a Biblioteca do Sistema JRE . O padrão funcionou para mim.

Isso funciona porque você tem várias classes em diferentes arquivos jar. Remover e adicionar novamente a biblioteca JRE fará com que as classes corretas sejam as primeiras. Se você deseja uma solução fundamental, exclua os arquivos jar com as mesmas classes.

Para mim eu tenho: javax.xml.soap.SOAPPartem três frascos diferentes: axis-saaj-1.4.jar, saaj-api-1.3.jareort.jar

Nels Beckman
fonte
1
É um bug do Eclipse ou estamos acidentalmente contornando a restrição (e violando os termos da licença)? Se for um bug do Eclipse, existe um bug arquivado?
docwhat
@ Doctor Nunca usei isso para nenhum código que fosse particularmente importante, então não investiguei mais ... Se você descobrir alguma coisa, informe-nos.
Nels Beckman
3
@ URL87 Se você clicar com o botão direito do mouse na pasta do projeto, vá para "Build Path ...", "Configure Build Path", "Libraries" (guia), você verá "Add Library" como um dos botões à direita. . Isso funcionou um encanto para mim também, excelente resposta
Alexei azul
8
A melhor solução nas versões recentes do Eclipse não é excluir a Biblioteca do Sistema JRE, mas ir para a guia "Ordem e Exportar" e simplesmente mover a Biblioteca do Sistema JRE para a parte inferior (que é efetivamente o que a exclusão e a inclusão faz, mas você não deve precisa excluir e adicionar para fazer isso).
user1676075
1
Este é o ano de 2018 e a versão do eclipse é 5.0. Este bug / problema ainda existe. Muito obrigado @NelsBeckman. Sua resposta me ajudou após 3/4 da década desde que foi publicada.
Aravamudhan
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html funcionou melhor para mim.

No Windows: Windows -> Preferências -> Java -> Compilador -> Erros / Avisos -> API reprovada e restrita -> Referência proibida (regras de acesso): -> alterar para aviso

No Mac OS X / Linux: Eclipse -> Preferências -> Java -> Compilador -> Erros / Avisos -> API reprovada e restrita -> Referência proibida (regras de acesso): -> alterar para aviso

scommab
fonte
62
Isso pode funcionar, mas não é uma solução adequada. Você precisa entender por que a restrição de acesso existia em primeiro lugar. Também ocultará todos os casos futuros disso, que podem ser mais importantes!
Adrian Mouat
1
@AdrianMouat que é praticamente irrelevante. Se eu quero que vá embora, quero que vá embora. Mas certamente - não se deve codificar contra APIs não públicas, não.
Stolsvik
3
@stolsvik - você me perdeu; você está dizendo que a razão pela qual o problema existe é irrelevante?
Adrian Mouat
1
Eu tenho esse problema em um método. Eu imagino o uso de um JDK alternativo (como o OpenJDK é uma opção melhor). Dito isto, por um lado, "pode ​​ser legal" uma vez. NÃO no código de produção. Não para um esforço contínuo de design. Não sei dizer quantos homens-dia se perdem nesse tipo de cr-hack.
vai
5
@AdrianMouat - faz sentido. Eu odiaria fazer algo assim em um reator nuclear - Muito calor na sala de controle? Portanto, desative todos os avisos. Faça grandes manchetes no dia seguinte. : P
david blaine
67

Eu encontrei o mesmo problema. Encontrei a resposta no site: http://www.17ext.com .
Primeiro, exclua as bibliotecas do sistema JRE. Em seguida, importe as bibliotecas do sistema JRE novamente.

Não sei por que. No entanto, isso resolveu meu problema, espero que possa ajudá-lo.

sanwanxian
fonte
10
Aparentemente, você respondeu a essa pergunta da mesma maneira que eu, vários meses antes. Não sei por que eu não vi sua resposta naquela época ...
Nels Beckman
34

Meu palpite é que você está tentando substituir uma classe padrão que é fornecida com Java 5 por uma em uma biblioteca que você possui.

Isso não é permitido sob os termos do contrato de licença, no entanto, o AFAIK não foi imposto até o Java 5.

Eu já vi isso com QName antes e o "consertei" removendo a classe do jar que eu tinha.

EDITAR http://www.manpagez.com/man/1/java/ notes para a opção "-Xbootclasspath:"

"Os aplicativos que usam essa opção com o objetivo de substituir uma classe no rt.jar não devem ser implementados, pois isso contraria a licença de código binário do Java 2 Runtime Environment."

o http://www.idt.mdh.se/rc/sumo/aJile/Uppackat/jre/LICENSE

"Restrições à tecnologia Java. Você não pode modificar a Java Platform Interface (" JPI ", identificada como classes contidas no pacote" java "ou quaisquer subpacotes do pacote" java "), criando classes adicionais na JPI ou causando o adição ou modificação das classes na JPI.No caso de você criar uma classe adicional e APIs associadas que (i) estendem a funcionalidade da plataforma Java e (ii) são expostas a desenvolvedores de software de terceiros para com o objetivo de desenvolver software adicional que invoque essa API adicional, você deve publicar prontamente uma especificação precisa dessa API para uso gratuito por todos os desenvolvedores. Você não pode criar ou autorizar seus licenciados a criar classes adicionais, interfaces,ou subpacotes identificados de alguma forma como "java", "javax", "sun" ou convenção semelhante, conforme especificado pela Sun em qualquer designação de convenção de nomenclatura. "

Peter Lawrey
fonte
2
é isso aí. um dos frascos no caminho tinha a classe QName nele. encontrar . -name "* .jar" -print -exec descompacta -t {} \; | grep "QName" o encontrou.
Sal
1
Você poderia fornecer uma referência sobre não ter permissão para substituir classes fornecidas com Java? Tudo o que encontrei no contrato de licença foram restrições relacionadas à distribuição do próprio Java, não a programas Java, mas não demorei muito.
Adrian Mouat
25

Também recebi esse erro, mas meu projeto foi desenvolvido na linha de comando usando o Maven e o compilador tycho (é um conjunto de plugins OSGi). Após várias pesquisas entre as pessoas com o mesmo problema, mas corrigindo-o no Eclipse, e não na linha de comando, encontrei uma mensagem no fórum de desenvolvedores do Tycho que respondeu minha pergunta, usando a configuração pom.xmlpara ignorar o aviso do compilador sobre a restrição de acesso:

<plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>tycho-compiler-plugin</artifactId>
    <version>${tycho.version}</version>
    <configuration>
        <compilerArgument>-warn:+discouraged,forbidden</compilerArgument>
    </configuration>
</plugin>

Mais informações podem ser encontradas nas Perguntas frequentes sobre o Tycho . Isso levou o AGES a resolver, então imaginei que ajudaria qualquer outra pessoa que tentasse corrigir esses erros de restrição de acesso na linha de comando postando esta resposta.

Dawngerpony
fonte
13
  • Vá para as configurações do caminho de construção nas propriedades do projeto. Windows -> Preferences -> Java Compiler
  • Remova a biblioteca do sistema JRE
  • Adicione outro JRE com uma "combinação perfeita"
  • limpe e construa seu projeto novamente. Funcionou para mim.
Mayur
fonte
13

Eu também tive esse problema. Aparentemente, eu configurei o JRE para 1,5 em vez de 1,6 no meu caminho de construção.

Dorus
fonte
1
O mesmo problema aqui. No meu caso, usando o Maven, o padrão é 1,5, se não especificado.
precisa
Lembre-se de colocar isso no seu POM para que não volte a ser alterado quando atualizado. <properties> <maven.compiler.source> 1,8 </maven.compiler.source> <maven.compiler.target> 1,8 </maven.compiler.target> </ properties>
Philip Rego
8

Além da solução de Nels Beckman , tenho as seguintes dicas:

Em Configure Build Path , tive que reorganizar a ordem das minhas entradas em Order and Export .

Além disso, como desenvolvedor do Eclipse PDE, eu precisava reorganizar a ordem das minhas dependências MANIFEST.MF, adicionando o pacote problemático como o primeiro da lista.

Tocando com esses mostradores, juntamente com a execução de Project> Clean no meio, consegui resolver esses avisos.

modulitos
fonte
8

para mim é assim que eu resolvo:

  • vá para o caminho de construção do projeto atual

em Bibliotecas

  • selecione a " Biblioteca do sistema JRE [jdk1.8xxx]"
  • clique em editar
  • e selecione "JRE padrão da área de trabalho (jdk1.8xx)" OU JRE alternativo
  • Clique em terminar
  • Clique OK

insira a descrição da imagem aqui

Nota: certifique-se de que, no Eclipse / Preferences (NÃO no projeto) / Java / Installed JRE, o jdk aponte para a pasta JDK e não para o JRE C: \ Arquivos de programas \ Java \ jdk1.8.0_74

insira a descrição da imagem aqui

usertest
fonte
O meu já estava definido para 1,7 ... 79, então eu estava em pânico. Mas eu simplesmente o selecionei novamente, cliquei em Aplicar e o erro desapareceu. Ufa.
Marvo
Uau. Isso também ajudou aqui - mudar de um "ambiente de execução" para um "JRE alternativo". Se alguém tiver alguma explicação lógica para isso ... (aqui ocorreu depois de alterar o Java da torneira do projeto de 1,5 (5,0 no arquivo de configuração .settings) para 1,8) A alteração de erro para aviso em prefs globais (consulte outra resposta) não ocorreu. . Ajuda: erros ainda Sua cerca de aulas sol velhos que usamos a partir com.sun.image.codec pacote *).
hyphan
6

Desculpe por atualizar um POST antigo. Eu obtive o problema relatado e resolvi-o conforme mencionado abaixo.

Supondo que você esteja usando o plug-in Eclipse + m2e maven, se você receber esse erro de restrição de acesso, clique com o botão direito do mouse no projeto / módulo no qual você tem o erro -> Propriedades -> Caminho da Construção -> Biblioteca -> Substituir JDK / JRE para o que é usado na área de trabalho do eclipse.

Segui as etapas acima e o problema foi resolvido.

Arun B Chandrasekaran
fonte
É justo, mas você basicamente replicou o texto da resposta aceita por Nels Beckman.
precisa
5

No caso de você ter certeza de que deve poder acessar determinada classe, isso pode significar que você adicionou vários jars ao seu projeto contendo classes com nomes (ou caminhos) idênticos, mas com conteúdo diferente e elas estão se ofuscando (normalmente um costume antigo jar de compilação contém a versão mais antiga de uma biblioteca de terceiros).

Por exemplo, quando você adiciona um jar implementando:

a.b.c.d1
a.b.c.d2

mas também uma versão mais antiga implementando apenas:

a.b.c.d1
(d2 is missing altogether or has restricted access)

Tudo funciona bem no editor de código, mas falha durante a compilação se a biblioteca "antiga" ofuscar a nova - d2 repentinamente se torna "ausente ou inacessível", mesmo quando está lá.

A solução é verificar a ordem das bibliotecas em tempo de compilação e garantir que a implementação correta seja a primeira.

Mr. Napik
fonte
4

Vá para o Java Build Path nas propriedades do projeto. Remova a biblioteca do sistema JRE existente. Em seguida, adicione-a novamente, por exemplo, Adicionar biblioteca -> JRE Lib - selecione jre ---> Concluir. Por fim, selecione a guia ordem e exportação, selecione JRE Lib e mova para cima. É isso aí.

Vijay Bhatt
fonte
3

Apenas mude a ordem das bibliotecas de caminhos de construção do seu projeto. Clique com o botão direito do mouse em projeto> Caminho da Construção> Configurar Caminho da Construção> Selecionar Pedido e Exportar (Guia)> Alterar a ordem das entradas. Espero que a movimentação da "biblioteca JRE System" para o final funcione. Funcionou assim para mim. Fácil e simples .... !!!

Samitha Chathuranga
fonte
3

No meu caso, houve uma incompatibilidade entre o caminho do build JRE e o JRE instalado no ambiente de execução. Eu mudei para Projeto> Propriedades> Compilador Java. Havia uma mensagem de aviso na parte inferior.

Cliquei nos links 'Installed JRE', 'Execution environment', 'Java build path' e alterei a versão do JDK para 1.7 e o aviso desapareceu.

Soumyajit Swain
fonte
0

Incluir um sistema JRE correto através do caminho de construção é a solução, mas seu eclipse ainda pode ter o erro. Para resolver isso, vá para o Java Build path -> Order and Export e mova sua biblioteca do sistema JRE na parte superior. Isso resolveu meu problema.

Abhishek Soni
fonte