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)
O eclipse diz isto:
Restrição de acesso: O tipo 'Application' não é API (restrição na biblioteca requerida '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
Isto também me aconteceu, e as respostas aqui dadas já não eram satisfatórias, por isso fiz a minha própria pesquisa.
Eclipse tem um mecanismo chamado restrições de acesso para evitar que você use acidentalmente classes que o Eclipse acha que não fazem parte da API pública. Normalmente, o Eclipse está certo sobre isso, em ambos os sentidos: Normalmente não queremos usar algo que não faça parte da API pública. E o Eclipse normalmente está certo sobre o que é e o que é't parte da API pública.
Agora, pode haver situações, onde você quer utilizar o público não-API, como sun.misc
(você deven't, a menos que você saiba o que você're fazer). E pode haver situações, onde o Eclipse não está realmente certo (isso'é o que me aconteceu, eu só queria usar javax.smartcardio
). Nesse caso, obtemos esse erro no Eclipse.
A solução é alterar as restrições de acesso.
javax/smartcardio/**
", para você pode ser "com/apple/eawt/**
".Eu estava a ter o mesmo problema. Quando eu inicialmente criei o projeto java no Eclipse, especifiquei o JRE 8. Quando entrei no projeto's build path 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.
Para começar com (e sem relação), instanciar a classe Aplicação
por si mesmo não parece ser a sua utilização pretendida. Pelo que se pode ler a partir do seu fonte, espera-se que você utilize a instância estática retornada por getApplication()
.
Agora deixe's chegar aos relatórios de erro do Eclipse. I'esbarrei num problema semelhante recentemente: "Restrição de acesso: O método ... não é API (restrição no projeto requerido)`. Eu chamei o método em questão como um método de um objeto que herdou esse método de uma super-classe. Tudo que eu tinha que fazer era adicionar o pacote em que a super-classe estava aos pacotes importados pelo meu plugin.
No entanto, há muitas causas diferentes para erros baseados em " restrição ao projeto/library". Similar 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 pode não ser exportado em si. Nesse caso, você pode tentar rastrear os pacotes que faltam e exportá-los você mesmo, como sugerido aqui, ou tentar Regras de Acesso. Outros cenários possíveis incluem:
Isto acabou mais como um medley de questões relacionadas com restrições do que como uma resposta real. Mas como restrição em projetos requeridos é um erro tão versátil a ser relatado, a receita perfeita provavelmente ainda está por ser encontrada.