javax.naming.NoInitialContextException – Java

Aqui está o meu código:

import javax.naming.InitialContext; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.QueueSender; import javax.jms.DeliveryMode; import javax.jms.QueueSession; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; public class Sender { public static void main(String[] args) throws Exception { // get the initial context InitialContext ctx = new InitialContext(); // lookup the queue object Queue queue = (Queue) ctx.lookup("queue/queue0"); // lookup the queue connection factory QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx. lookup("queue/connectionFactory"); // create a queue connection QueueConnection queueConn = connFactory.createQueueConnection(); // create a queue session QueueSession queueSession = queueConn.createQueueSession(false,Session.DUPS_OK_ACKNOWLEDGE); // create a queue sender QueueSender queueSender = queueSession.createSender(queue); queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // create a simple message to say "Hello" TextMessage message = queueSession.createTextMessage("Hello"); // send the message queueSender.send(message); // print what we did System.out.println("sent: " + message.getText()); // close the queue connection queueConn.close(); } } 

O Eclipse não está reportando nenhum erro no código acima – eu posso compilar com sucesso. No entanto, quando tento executá-lo, recebo a seguinte exceção:

 Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(Unknown Source) at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source) at javax.naming.InitialContext.lookup(Unknown Source) at Sender.main(Sender.java:21) 

Alguém por favor pode me ajudar a consertar o bug? Eu tentei corrigi-lo por algumas horas, mas ainda não consigo descobrir.

Precisamos especificar o INITIAL_CONTEXT_FACTORY, PROVIDER_URL, USERNAME, PASSWORD, etc. do JNDI para criar um InitialContext .

Em um aplicativo independente, você pode especificar isso como abaixo

 Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://ldap.wiz.com:389"); env.put(Context.SECURITY_PRINCIPAL, "joeuser"); env.put(Context.SECURITY_CREDENTIALS, "joepassword"); Context ctx = new InitialContext(env); 

Mas se você estiver executando seu código em um contêiner Java EE, esses valores serão buscados pelo contêiner e usados ​​para criar um InitialContext como abaixo

 System.getProperty(Context.PROVIDER_URL); 

e

esses valores serão definidos ao iniciar o contêiner como argumentos da JVM. Então, se você estiver executando o código em um contêiner, o seguinte funcionará

 InitialContext ctx = new InitialContext(); 

Se estiver trabalhando na biblioteca do cliente EJB:

Você precisa mencionar o argumento para obter o contexto inicial.

 InitialContext ctx = new InitialContext(); 

Se você não fizer isso, ele procurará na pasta do projeto pelo arquivo de propriedades. Além disso, você pode include as credenciais ou valores das propriedades em seu próprio arquivo de class da seguinte maneira:

 Properties props = new Properties(); props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); props.put(Context.PROVIDER_URL, "jnp://localhost:1099"); InitialContext ctx = new InitialContext(props); 

URL_PKG_PREFIXES: Constante que contém o nome da propriedade do ambiente para especificar a lista de prefixos de pacote a serem usados ​​ao carregar em fábricas de contexto de URL.

A biblioteca do cliente EJB é a biblioteca principal para chamar componentes EJB remotos.
Esta biblioteca pode ser usada através do InitialContext. Para invocar componentes EJB, a biblioteca cria um contexto de cliente EJB por meio de um factory de contexto de URL. A única configuração necessária é analisar o valor org.jboss.ejb.client.naming para a propriedade java.naming.factory.url.pkgs para instanciar um InitialContext.