Restrição de acesso: O tipo 'Aplicativo' não é API (restrição na biblioteca necessária rt.jar)

178

Aqui está o código:

package mscontroller;

import javax.swing.*;
import com.apple.eawt.Application;

public class Main {
    public static void main(String[] args)
    {
        Application app = new Application();
        app.setEnabledAboutMenu(true);

        AMEListener listener = new AMEListener();
        app.addApplicationListener(listener);
        JFrame mainFrame = new JFrame("Application Menu Example");
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

aqui está o erro:

Exception in thread "main" java.lang.Error: Unresolved compilation
problems:   Access restriction: The type 'Application' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The constructor 'Application()' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The type 'Application' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The method
'Application.setEnabledAboutMenu(boolean)' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    AMEListener cannot be resolved to a type    AMEListener cannot be
resolved to a type

    at mscontroller.Main.main(Main.java:9)

eclipse diz o seguinte:

Restrição de acesso: o tipo 'Aplicativo' não é API (restrição na biblioteca necessária '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')

www139
fonte
3
Tente executar isso usando Java 7.
spoko
2
Verifique-os quanto à relevância: stackoverflow.com/questions/860187/… , stackoverflow.com/questions/9266632/…
user2864740
Não usando o Xcode (ainda)
www139 09/08/19
Eu não estou familiarizado com java, o cara não dá um caminho exato. O que ele quer dizer com: com / sun / xml / internal / **
www139
1
Você poderia interpretar de que caminho ele está falando? Obrigado! No futuro, mudarei para xCode ou netbeans. O cara acima disse para tentar java 7 devo?
www139 9/08/14

Respostas:

276

Isso aconteceu comigo também, e as respostas dadas aqui já não eram satisfatórias, então fiz minha própria pesquisa.

Fundo: Restrições de Acesso do Eclipse

O Eclipse possui um mecanismo chamado restrições de acesso para impedir o uso acidental de classes que, segundo o Eclipse, não fazem parte da API pública. Geralmente, o Eclipse está certo sobre isso, nos dois sentidos: geralmente não queremos usar algo que não faz parte da API pública. E o Eclipse geralmente está certo sobre o que é e o que não faz parte da API pública.

Problema

Agora, pode haver situações em que você deseja usar a Não API pública, como sun.misc(você não deveria, a menos que saiba o que está fazendo). E pode haver situações em que o Eclipse não está realmente certo (foi o que aconteceu comigo, eu só queria usar javax.smartcardio). Nesse caso, obtemos esse erro no Eclipse.

Solução

A solução é alterar as restrições de acesso.

  • Vá para as propriedades do seu projeto Java,
    • ou seja, selecionando "Propriedades" no menu de contexto do projeto no "Package Explorer".
  • Vá para "Java Build Path", guia "Bibliotecas".
  • Expanda a entrada da biblioteca
  • selecionar
    • "Regras de acesso",
    • "Editar ..." e
    • "Adicionar ..." a "Resolução: acessível" com um padrão de regra correspondente. Para mim foi " javax/smartcardio/**", para você pode ser " com/apple/eawt/**".
Christian Hujer
fonte
28
Eu tenho o Eclipse Mars (4.5.0) e não há regras de acesso no Java Build Path -> Libraries. FWIW, há um martelo maior (você pode desativá-los todos) em Preferências -> Java -> Compilador -> Erros / Avisos -> API reprovada e restrita.
Jonathan Ross
4
Eu tenho o Eclipse Mars.1 Release (4.5.1). Para mim, ambas as soluções funcionaram. A resposta de Christian e o comentário de Jonathan. Na guia Bibliotecas, você deve abrir a lista entre os "JARs e pastas de classe" listados para que as "Regras de acesso" pertençam a ela.
Laszlo Hirdi 13/01
3
Isso não funciona para mim. Eclipse Luna. Tentei o JDK 1.8, 1.7, regras de acesso adicionadas, projeto limpo, os erros continuam voltando. Também tentei a sugestão de @ Jonathan Jonathan - primeiro no nível do projeto. Lá, embora as configurações no nível do projeto para APIs proibidas / desencorajadas tenham sido definidas como Aviso, ainda tenho erros. Eu tentei (como Jonathan sugeriu) passar por preferências para configurações no nível da área de trabalho e LÁ, APIs Proibidas foram definidas como Erro. Mudar para aviso lá fez com que o problema desaparecesse, mas a configuração do nível do projeto deveria ter sido substituída; pense que isso é um bug no Eclipse.
27516 Steve Cohen
2
Eu não tinha permissão para modificar a restrição de acesso no meu caso: Eclipse Neon com um projeto maven jar no jar "jfxrt.jar".
Pdem
2
Há uma alternativa muito mais simples: remover e adicionar de volta o Sistema de Bibliotecas JRE, como fora apontado em stackoverflow.com/a/2174607/222838
mico
81

Eu estava tendo o mesmo problema. Quando criei o projeto java inicialmente no Eclipse, especifiquei o JRE 8. Quando entrei no caminho de construção do projeto e editei a Biblioteca do Sistema JRE, o ambiente de execução do Java 8 foi selecionado. Quando eu escolhi usar um "Alernate JRE" (ainda java 8), ele corrigiu o erro para mim.

Âmbar
fonte
2
Eu preferia uma correção global, mas é melhor do que todas as outras respostas que permitem API restrita globalmente. (Não quero usar acidentalmente sun. * No meu aplicativo javafx).
Mark Jeronimus
1
Obrigado, isso apagou todos os avisos no meu projeto. Eclipse se queixava de todas as classes que foram fornecidas por JavaFX (jfxrt.jar)
Goran Vasic
2
Confirmado ... Alterei o JRE 8 u60 por ... JRE 8 u60. Aparentemente, essa reconstrução sendo acionada, em oposição a qualquer outra maneira de fazer isso, tem o efeito colateral de corrigir o problema. (Para uma explicação mais detalhada sobre como alterar essa configuração, consulte a resposta de Nikhil Mahajan aqui: stackoverflow.com/questions/6881622/... .)
Ancião Ancião
Obrigado! Com essa estratégia, eu consegui compilar com êxito o framework spark java.
Martin Pabst
1
Estranhamente isso funcionou. Eu tenho apenas um JDK instalado. Que estranho.
WesternGun
65

Adicionando permissão acessível javafx no eclipse oxygen, vá para projeto> propriedades> caminho de construção java> bibliotecas> expanda as bibliotecas e clique duas vezes em> Regras de acesso, onde você define a permissão Resolução: Padrão de regra acessível: javafx / **

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

vidyakumargv
fonte
23

Para começar ( e não relacionado ), instanciar a Applicationclasse por si mesmo não parece ser o uso pretendido. Pelo que se pode ler de sua origem , espera-se que você use a instância estática retornada por getApplication().

Agora vamos ao relatório de erros do Eclipse. Eu corri para um problema semelhante recentemente: Access restriction: The method ... is not API (restriction on required project). Chamei o método em questão como o método de um objeto que herdou esse método de uma superclasse. Tudo o que eu precisava fazer era adicionar o pacote em que a superclasse estava nos pacotes importados pelo meu plugin.

No entanto, existem muitas causas diferentes para erros com base na "restrição no projeto / biblioteca necessário ". Semelhante ao problema descrito acima, o tipo que você está usando pode ter dependências para pacotes que não são exportados pela biblioteca ou podem não ser exportados por si. Nesse caso, você pode tentar rastrear os pacotes ausentes e exportá-los por conta própria, como sugerido aqui , ou tentar Regras de Acesso. Outros cenários possíveis incluem:

  • O Eclipse deseja impedir que você use pacotes disponíveis que não fazem parte da API Java pública (solução 1 , 2 )
  • As dependências são satisfeitas por várias fontes, as versões são conflitantes etc. (solução 1 , 2 , 3 )
  • O Eclipse está usando um JRE em que um JDK é necessário (o que pode ser o caso aqui, pelo que dizem seus erros; solução ) ou a versão do JRE / JDK no caminho de construção do projeto não é a correta

Isso acabou sendo mais uma mistura de questões relacionadas a restrições do que uma resposta real. Mas como a restrição de projetos necessários é um erro tão versátil a ser relatado, a receita perfeita provavelmente ainda será encontrada.

J. Katzwinkel
fonte
18

Eu tive esse problema porque a faceta do projeto associada ao meu projeto era a versão java errada.

Para corrigir isso, fiz o seguinte:

  1. Clique com o botão direito do mouse no projeto e selecione Propriedades
  2. Selecione 'Facetas do projeto' e altere a versão do java para algo maior que 1.4.
  3. Clique em [Apply]

Isso reconstruirá seu projeto e, esperançosamente, o erro será resolvido.

Kiriya Keat
fonte
15

Tivemos que mudar nosso aplicativo para compilar com o JDK 1.8 usando Window-> Preferences-> Java-> Installed JREs . No entanto, após alterar isso, a Biblioteca do Sistema JRE especificada no Project Explorer ainda estava incorreta. Para corrigir isso, clique com o botão direito do mouse em "Biblioteca do sistema JRE [errado-jre-aqui]" e altere do ambiente Execution: para "Padrão do espaço de trabalho (padrão do yer-aqui)"

insira a descrição da imagem aqui

Dinsdale
fonte
1
Obrigado! Que segura a minha vida :)
KMC
13

Funcionou: Propriedades do Projeto -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Aplicar

Kamila O
fonte
sistema desligou :(
Saikat
12

Na barra de menus superior do Eclipse:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning
Phil Long
fonte
9

Se você está tendo esse mesmo problema usando o Spring Tool Suite:

O IDE subjacente do Spring Tool Suite é, de fato, o Eclipse. Eu recebi esse erro agora mesmo tentando usar algumas com.sun.netclasses. Para remover esses erros e impedir que eles apareçam na plataforma Eclipse Luna SR1 (4.4.2) do STS:

  • Navegue para Projeto> Propriedades
  • Expanda o cabeçalho do Java Compiler
  • Clique em Erros / Avisos
  • Expanda API reprovada e restrita
  • Ao lado de "Referência proibida (regras de acesso)", selecione "ignorar"
  • Ao lado de "Referência desencorajada (regras de acesso)", selecione "ignorar"

Você está pronto para ir.

Grandclosing
fonte
6

Teve o mesmo problema. Aqui está como eu resolvi: Vá para o Package Explorer. Clique com o botão direito do mouse em JRE System Library e acesse Propriedades. No Contêiner do Caminho de Classe> Selecionar JRE para o caminho de construção do projeto, selecione a terceira opção (JRE padrão da Área de Trabalho).

Fonte: https://thenewboston.com/forum/topic.php?id=3917

Nishant_Singh
fonte
1
Obrigado ... usando a resposta proposta por C Hujer eu realmente descobri que havia "162 regras (não modificáveis)" para o arquivo jfxrt.jar!
Página Inicial>
5

Vá para a seguinte configuração:

Janela -> Preferências -> Referência do Java-Compiler-Erros / Avisos-Descontinuada e Restrita à API Proibida (regras de acesso)

Defina como Warningou Ignore.

cxj
fonte
5

Usamos o IBM Rational Application Developer (RAD) e tivemos o mesmo problema.

Mensagem de erro:

Restrição de acesso: O tipo 'JAXWSProperties' não é API (restrição na biblioteca necessária 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Solução:

vá para o caminho de construção java e, na guia Biblioteca, remova a Biblioteca do sistema JRE. Em seguida, novamente Adicionar Biblioteca -> Biblioteca do Sistema JRE

Jonas_Hess
fonte
4

No Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
selecione JRE ... e pressione Editar: Alterne para o Workspace JRE (jdk1.8.0_77)

Funciona para mim.

Sven
fonte
3

Eu tenho eclipse JRE 8.112, não tenho certeza se isso importa, mas o que eu fiz foi isso:

  1. Clique com o botão direito do mouse na minha pasta de projetos
  2. desceu às propriedades e clicou
  3. clicou na pasta java build path
  4. uma vez dentro, eu estava na ordem e exportei
  5. Eu verifiquei a biblioteca do sistema JRE [jre1.8.0_112]
  6. então o moveu para cima da outra biblioteca do sistema JRE (não tenho certeza se isso importava)
  7. então apertou ok

Isso resolveu meu problema.

quasar-light
fonte
2

Simplesmente adiciono o clip (e) no mercado do eclipse. Fácil e Simples

Jessie
fonte
1

Estou usando o eclipse neon 3. Eu só queria usar javafx.application.Application, então segui a resposta de Christian Hujer acima e funcionou. Apenas algumas dicas: as regras de acesso são muito semelhantes à declaração de importação. Para mim, as regras de acesso que adicionei foram "javafx / application / **". Apenas substitua o ponto na declaração de importação por barra e essa é a regra. Espero que ajude.

Tony S
fonte
1

Eu tive um pequeno problema diferente. Na biblioteca Projeto - Propriedades - Bibliotecas - JRE, a versão lib do JRE estava errada. Remova e defina o atual e pronto - todos os Access restriction...avisos estão ausentes.

Gangnus
fonte
1

Mesmo que seja uma pergunta antiga, para mim no Eclipse, clique com o botão direito do mouse na pasta Src e nas propriedades (Alt + Enter) e verifique se Ignore optional compile problemso erro foi removido.

insira a descrição da imagem aqui

MrSimpleMind
fonte
0

Se alguém está tendo esse problema apenas na sua ferramenta de IC enquanto executa o maven, o que fez o truque para mim foi definir explicitamente o ambiente de execução no seu MANIFEST.MF.

No meu caso, fiz isso inserindo a seguinte linha no meu arquivo de manifesto do pacote configurável OSGi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Fernando Paz
fonte