NetBeans Mit "externen" Dateien arbeiten-wie?

White_Fox

Top Contributor
Fröhliche Weihnachten allerseits 🙂

Folgendes: Ich möchte in einem Programm Unterstützung für mehrere Sprachen anbieten. Dazu will ich für jede Sprache eine Datei vorhalten, die die benötigten Strings enthält. Später, im fertigen Programm, soll es im Installationspfad einen Ordner geben der all diese Dateien enthält.

Wie aber bringe ich Netbeans dazu, diesen Ordner später beim Kompilieren in den dist-Ordner zu kopieren? Und wie kann ich während der Entwicklung damit einigermaßen komfortabel arbeiten, sodaß mir diese Dateien auch z.B. in Unittests (JUnit) zur Verfügung stehen? Idealerweise so, daß ich die gleichen Pfade im Programm benutzen kann und vor dem Kompilieren nicht ständig die Pfade ändern muß.
Und obgleich Netbeans 9 schon draußen ist, arbeite ich noch recht gern mit Netbeans 8.2.

Hat jemand eine Idee?
 
Wieso sind es eigentlich immer die NetBeans user, die glauben, dass NetBeans = Java ist 😉. Es ist vollkommen irrelevant, welche IDE du zum Entwickeln verwendest. Und nichts, was du in deinem Programm tust, ist bzw. sollte spezifisch für eine bestimmte IDE sein.
Lege einfach die Textdateien in einen classpath root und lade sie zur Laufzeit per ClassLoader getResource bzw. getReourceAsStream.
 
Es ist eher eine Frage zu Netbeans als zu Java, das ist mir schon klar. Und im Quellcode selber will ich ja nix Netbeansspezifisches haben-deswegen frag ich ja. 🙂

Die Klasse, die die Dateien später auslesen soll, hab ich in einer eigenen Bibliothek angelegt, die benutze ich sicher nicht zum letzten Mal. Alles wild in den Programmordner zu werfen wäre auch eine Möglichkeit, allerdings hätte ich gern etwas Ordnung darin.
Den ClassLoader schaue ich mir aber trotzdem mal an, damit hab ich noch nie gearbeitet. Vielen Dank.
 
Also-ich hab mir mal etwas zu ClassLoadern angelesen, ich sehe aber nicht wie mir das helfen kann.

Ich hatte gehofft, das über irgendwelche Projekteinstellungen oder notfalls z.B. über die Build.xml-Datei realisieren zu können. Damit kriege ich es zwar hin, daß die Dateien beim Bauen im erwarteten Pfad im dist-Ordner landen, allerdings wirft mein Programm zuverlässig eine FileNotFound-Exception wenn ich es in der IDE laufen lasse (und vermutlich wird die auch bei Unittests kommen).
Wie kann ich das z.B. beheben?
 
Zuletzt bearbeitet:
Die Lösung, die ich meinte, basiert darauf, dass du die zu ladenden Ressourcen als Source bzw. Classpath Ressource hinzufügst. Jede IDE ist dann in der Lage, diese Ressource entsprechend auszuliefern (z.B. in den Classpath Folder des gestarteten Java-Prozesses zu kopieren - genauso wie es für aus .java-Dateien kompilierte .class-Dateien der Fall ist) oder im Falle eines Fat-Jars, diese an die entsprechende Stelle im Jar zu kopieren.
Siehe hierzu z.B. https://stackoverflow.com/questions/3718201/how-to-add-resources-to-classpath
Zum Laden dann entsprechend eben den ClassLoader gemühen:
- https://stackoverflow.com/questions/3294196/load-resource-from-anywhere-in-classpath

Du kannst die Ressourcen natürlich auch einfach in einen Dateisystem-Ordner legen und neben die ausgelieferte Jar-Datei legen und per Dateisystem-API z.B. via FileInputStream laden.
 
@White_Fox was Du willst, ist ein ResourceBundle. Das sind .properties-Dateien mit dem gleichen Basisnamen und angehängter Locale. Die Dateien müssen sich lediglich im gleichen Package im Classpath befinden, dann kann das Bundle geladen und auf die Übersetzungen in die vorhandenen Sprachen zugegriffen werden.

In einem ant-Projekt erstellst Du dazu einfach unter den Sourcen ein Package und dort eine .properties-Datei (z. B. bundle.properties) an. Das wird dann automatisch mitkopiert.

In einem maven-Projekt legst Du das Package unter "Other Sources" an (Projektansicht). In der Dateiansicht wäre dies unter src/main/resources bzw. für Tests src/test/resources. Maven packt die Ressourcen dann zum Jar dazu.

Außerdem bietet NetBeans unter Tools -> Internationalization -> Internationalization Wizard ein Tool an, um in Quelltexten vorhandene Strings zu "internationalisieren". Probiers einfach mal aus. Das Ergebnis ist nicht von NetBeans abhängig, sondern verwendet Standard-Javamethoden (java.util.ResourceBundle).

Nachtrag: gerade noch gefunden https://netbeans.org/kb/docs/java/gui-automatic-i18n.html#Exercise_2
 
Danke euch beiden. 🙂

Ich hab es zwar noch-mit viel Probieren-über die build.xml hinbekommen-falls jemand anderes mal noch vor dem Problem steht: Dieser Schnipsel in der build.xml-Datei erstellt nach jedem Kompiliervorgang einen Ordner mit dem Namen "ordner" im dist-Ordner und kopiert alle Dateien, die unter ".../Projektordner/ordner/" zu finden sind hinein, sodaß diese Dateien dann zur Laufzeit über den Pfad "ordner/dateiname.dat" aufgerufen werden können.
Code:
<target name="-post-jar">
        <mkdir dir="${dist.dir}/ordner"/>
        <copy todir="${dist.dir}/ordner">
           <fileset dir="${basedir}/ordner" />
        </copy>
   </target>

Dennoch werde ich dieses hier wohl mit den RessourceBundle lösen. Das ist ja genau für mein Problem gemacht. 🙂
 

Neue Themen


Zurück
Oben