Einfach starten der standalone-JNDI-server (und registrieren einige Ressourcen)
Für Testzwecke, ich bin auf der Suche nach eine einfache Möglichkeit zum starten einer standalone JNDI-server ein, und bind mein javax.sql.DataSource "java:/comp/env/jdbc/mydatasource"
programmgesteuert.
Sollte der server an sich binden, um einige URL, zum Beispiel: "java.die Benennung.Anbieter.url=none://localhost:1099" (nicht NONE), so dass ich nachsehen kann, meine datasource aus einem anderen Prozess. I don ' T care über die JNDI-server-Implementierung, die ich verwenden müssen (aber ich will nicht zum starten eines ausgewachsenen Java ee server).
Diese sollte so einfach sein, aber zu meiner überraschung, konnte ich nicht finden, jede (Arbeits -) tutorial.
- Ich bin mir nicht sicher, dass diese Frage durchaus Sinn macht. JNDI ist eine API, kein Protokoll. Die API bietet Zugriff auf verschiedene naming-Protokolle. So sind Sie wirklich gefragt für einen Weg zu starten Sie einen server für einige willkürliche Namensgebung Protokoll, das Sie verwenden können, JNDI gegen? Dann sind Sie gehen zu binden eine DataSource es. Aber das DataSource existiert in dem server-Prozess, richtig? Also, was passiert, wenn ein client in einem anderen Prozess darum bittet? Das ganze
java:
- namespace ist in der Regel sehr viel ein in-process-Sache. - Ich wollte nicht gehen in die Details, aber ich bin wirklich versucht zu binden eine c3p0 ComboPooledDataSource - und die Dokumentation behauptet, dass "c3p0 DataSources sind beide Referenzierbaren und Serializable, und eignen sich somit für die Bindung an eine Breite Vielfalt von JNDI-based naming services".
- Okay, das scheint vernünftig dann. Ich Frage mich, wie Sie das tun? Was clever chaps müssen Sie sein.
- Es gibt keine solche Sache wie eine JNDI-server ein. Sie haben zu entscheiden, welche Art von server Sie wollen, zu sprechen, LDAP, COSnaming, RMI-registry, DNS, ... und JNDI verwenden als client-side-Technologie, zu sprechen. Die Frage macht keinen Sinn.
- Der name "JNDI-server" ist nicht sehr präzise, in der Tat. Was ich aber meinte damals (vor mehr als 3 Jahren...), war ein server, auf die zugegriffen werden kann durch einen JNDI-client (mir egal welche, solange es mir erlaubt, binden Sie das Objekt in einer Weise, dass der client Sie Lesen kann. Die Vorstellung von einem "JNDI-server" wurde hauptsächlich von c3p0 ' s Erwähnung von "JNDI-based naming services".)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das JDK enthält ein JNDI-provider für die RMI-registry. Das bedeutet, dass Sie können verwenden Sie die RMI-registry als eine JNDI-server ein. Also, starten Sie einfach rmiregistry, set java.die Benennung.factory.erste zu com.Sonne.jndi.rmi.Registrierung.RegistryContextFactory, und du bist Weg.
Den RMI-registry hat einen flachen namespace,
, so dass Sie nicht in der Lage, zu binden, zu java:/comp/env/jdbc/mydatasource, aber Sie werden in der Lage sein, etwas zu bindenalso wird es akzeptieren java:/comp/env/jdbc/mydatasource, aber behandeln Sie es als ein ein-Komponenten-name (danke an @EJP).Ich habe eine kleine Anwendung geschrieben, um zu demonstrieren, wie dies zu tun: https://bitbucket.org/twic/jndiserver/src
Ich habe immer noch keine Ahnung, wie die NONE-server funktionieren soll.
java:/comp/env/jdbc/mydatasource
, aber Sie nicht verwenden können (z.B. Liste) von seiner intermediate-Namen. Aber wenn ich das bekomme ichException in thread "main" java.lang.IllegalArgumentException: RegistryContext: object to bind must be Remote, Reference, or Referenceable
.DataSource
zum Beispiel, was die Frage ist.Ich arbeitete an der Johns-code und jetzt funktioniert gut.
In dieser version bin ich mit libs von JBoss5.1.0.GA, siehe jar-Liste unten:
Dies ist der neue code:
Haben gute logging, verwenden Sie das log4j-Eigenschaften:
Verbrauchen die Standalone-JNDI-server verwenden Sie diesen client-Klasse:
Hier ist ein code-snippet angepasst von JBoss remoting-Proben. Der code ist
in den Proben (version 2.5.4.SP2 ) nicht mehr funktioniert. Während das Update
ist einfach, es hat mich mehr Stunden, als ich daran denken wollen, um es herauszufinden.
Seufz. Trotzdem, vielleicht kann jemand davon profitieren.
Ich weiß, ich bin spät zur party, aber ich landete hacken, diese zusammen wie so
javax.naming.NoInitialContextException: Need to specify class name in environmen t or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
. Das funktioniert nicht, wenn es nicht schon einen provider angegeben. Was die Frage über das, eigentlich.Haben Sie sich überlegt mit Mocks? Wenn ich mich Recht erinnere, verwenden Sie Schnittstellen für die Interaktion mit JNDI. Ich weiß, ich habe verspottete Sie mindestens einmal vor.
Als fallback, könnten Sie wahrscheinlich verwenden, Tomcat. Es ist nicht eine vollständige geblasen J2EE impl, es startet schnell und ist ziemlich einfach zu konfigurieren Sie die JNDI-Ressourcen für. Datenquelle setup ist gut dokumentiert. Es ist sub-optimal, aber sollte funktionieren.
Sie implizieren, die Sie gefunden haben, nicht funktionierenden tutorials; das kann bedeuten, Sie haben bereits gesehen, diese:
Ich hatte eine schnelle gehen, aber Sie konnte nicht damit es funktioniert. Ein wenig mehr Ausdauer könnte es tun, aber.
Für lokale, ein Prozess, standalone-jar purpouses ich würde spring-test-Paket:
startup log:
Bin ich auf der Suche für ein ähnliches einfaches starter-Lösung, vor kurzem. Die "Datei system-service provider von Sun Microsystems" gearbeitet hat, für mich auch. Sehen https://docs.oracle.com/javase/jndi/tutorial/basics/prepare/initial.html.
Das problem mit der RMI-Registrierung benötigen Sie eine viewer - hier müssen Sie nur Blick auf den Inhalt der Datei.
Müssen Sie möglicherweise fscontext-4.2.jar - ich erhielt es von http://www.java2s.com/Code/Jar/f/Downloadfscontext42jar.htm