Java
Java Basics
Mit OS X 10.2 führte Apple ein binäres plist-Format ein, welches deutlich weniger Speicherplatz benötigt als das bisherige.Mit Einführung von OS X 10.4 wurde dieses neue, binäre Format das Standard-Format. Dem binären Format liegt eine einfache XML-Struktur zugrunde (welche mit OS X 10.0 eingeführt wurde), welche sehr einfach mit Java zu lesen und zu parsen war.
Das neue Format muß nun speziell geparsed werden: entweder indem man Apples Property List Editor verwendet, oder durch die Verwendung der Apache Commons Configuration (deren API ebenfalls das Property List Format unterstützt). Inzwischen gibt es ein neues Projekt von Daniel Dreibrodt, der ein JAVA-Projekt pflegt, welches das Lesen der binären plist ermöglicht. Dieses Projekt ist unter der GPL3 lizensiert und kann hier gefunden werden:
http://code.google.com/p/plist/
Update: Es gibt ein neues Projekt auf sourceforge, welches das .plist-Format nicht nur lesen, sondern auch schreiben können soll. Ich habe es noch nicht getestet, aber ich möchte hier trotzdem schon einmal den Link veröffentlichen: Property List Library
Wenn man eine neue WebApplication mit der GWT SDK 2.0.3 und der App Engine SDK 1.3.3 in eclipse erstellt und dabei den Instantiations WindowBuilder Pro oder den GWT Designer verwendet, dann taucht der folgende Fehler auf, wenn man versucht die “GWT application” (google nennt dies “Development Mode”) zu starten.
Exception in thread “main” java.lang.NoSuchMethodError: org.mortbay.thread.Timeout.<init>(Ljava/lang/Object;)V
at org.mortbay.io.nio.SelectorManager$SelectSet.<init>(SelectorManager.java:306)
at org.mortbay.io.nio.SelectorManager.doStart(SelectorManager.java:223)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at org.mortbay.jetty.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:303)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at org.mortbay.jetty.Server.doStart(Server.java:233)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:543)
at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:421)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1035)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:783)
at com.google.gwt.dev.DevMode.main(DevMode.java:275)
Leider konnte ich bisher nicht herausfinden warum dies passiert, aber ich habe einen Workaround gefunden, mit dem man das Problem verhindern und umgehen kann:
Statt die App Engine SDK 1.3.3 beim Anlegen des neuen Web Application Projektes zu verwenden, erstellt man das Projekt zunächst unter Verwendung der App Engine SDK 1.3.1. Nachdem das Projekt erstellt ist, kann man mit einem Rechts-Klick auf das Projektverzeichnis (in eclipse) die Properties des Projektes ändern: Unter Google>App Engine kann man nun von der App Engine 1.3.1 die Einstellung auf die App Engine 1.3.3 ändern; das Projekt läuft dann ohne Probleme unter der neuen Engine.
Missing required argument ‘module[s]‘
Google Web Toolkit 2.0.3
DevMode [-noserver] [-port port-number | "auto"] [-whitelist whitelist-string] [-blacklist blacklist-string] [-logdir directory] [-logLevel level] [-gen dir] [-bindAddress host-name-or-address] [-codeServerPort port-number | "auto"] [-server servletContainerLauncher[:args]] [-startupUrl url] [-war dir] [-extra dir] [-workDir dir] module[s]where
-noserver Prevents the embedded web server from running
-port Specifies the TCP port for the embedded web server (defaults to 8888)
-whitelist Allows the user to browse URLs that match the specified regexes (comma or space separated)
-blacklist Prevents the user browsing URLs that match the specified regexes (comma or space separated)
-logdir Logs to a file in the given directory, as well as graphically
-logLevel The level of logging detail: ERROR, WARN, INFO, TRACE, DEBUG, SPAM, or ALL
-gen Debugging: causes normally-transient generated types to be saved in the specified directory
-bindAddress Specifies the bind address for the code server and web server (defaults to 127.0.0.1)
-codeServerPort Specifies the TCP port for the code server (defaults to 9997)
-server Specify a different embedded web server to run (must implement ServletContainerLauncher)
-startupUrl Automatically launches the specified URL
-war The directory into which deployable output files will be written (defaults to ‘war’)
-extra The directory into which extra files, not intended for deployment, will be written
-workDir The compiler’s working directory for internal use (must be writeable; defaults to a system temp dir)
and
module[s] Specifies the name(s) of the module(s) to host
Nachdem man einige Zeit mit einem GWT-Projekt in eclipse gearbeitet hat, kann es passieren, daß das Projekt sich nicht mehr als “GWT application” unter Jetty startetn lassen will. Ich versuche derzeit noch herauszufinden was da genau passiert. In der wischenzeit möchte ich kurz erläutern, wie man das Problem umgehen kann:
1) In eclipse vom “Run”-Menü den Menüpunkt “Run Configurations …” auswählen
2) Dann unter “GWT Application” und “Web Application” die Konfigurationen des Projektes löschen
Das war alles. Danach kann man wieder normal aus dem Selektor das Projekt als “GWT Application” starten und es läuft wieder problemlos unter Jetty.
Mein Workbench in eclipse wird leider sehr häufig beschädigt, und all die guten Ratschläge im Netz wie dies zu reparieren sei funktionieren nicht, da sie von der Tatsache ausgehen, daß eclipse gestartet ist. Was aber, wenn eclipse wegen der beschädigten Workbench überhaupt nicht mehr startet (Wie das normal bei mir der Fall ist)?
Als erstes sollte man das Logfile prüfen. Es ist im workbench-Verzeichnis zu finden und heißt “.metdata”. In diesem Verzeichnis ist die Datei “.log” zu finden. Öffne diese Datei und siehe nach, ob hier nicht etwas nützliches zu finden ist. Hier ist das File, welches ich heute erhalten habe:
!ENTRY org.eclipse.osgi 4 0 2009-06-25 18:56:21.330 !MESSAGE Application error !STACK 1 org.apache.commons.lang.exception.NestableError: Java Model Exception: Java Model Status [src/net/project/windows [in project] does not exist] at com.instantiations.designer.core.utils.execution.ExecutionUtils.runRethrow(ExecutionUtils.java:66) at com.instantiations.designer.core.editor.DesignPage.initialize(DesignPage.java:96) at com.instantiations.designer.core.editor.multi.MultiMode.create(MultiMode.java:74) at com.instantiations.designer.core.editor.multi.MultiPagesMode.create(MultiPagesMode.java:63) at com.instantiations.designer.core.editor.multi.MultiPageEditor.createPartControl(MultiPageEditor.java:57) at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:661) at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:428) at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:594) at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:306) at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180) at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270) at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65) at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473) at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1256) at org.eclipse.ui.internal.PartStack.handleDeferredEvents(PartStack.java:1224) at org.eclipse.ui.internal.LayoutPart.deferUpdates(LayoutPart.java:400) at org.eclipse.ui.internal.PartSashContainer.handleDeferredEvents(PartSashContainer.java:1401) at org.eclipse.ui.internal.LayoutPart.deferUpdates(LayoutPart.java:400) at org.eclipse.ui.internal.WorkbenchPage.handleDeferredEvents(WorkbenchPage.java:1383) at org.eclipse.ui.internal.WorkbenchPage.deferUpdates(WorkbenchPage.java:1373) at org.eclipse.ui.internal.WorkbenchPage.access$14(WorkbenchPage.java:1364) at org.eclipse.ui.internal.WorkbenchPage$15.runWithException(WorkbenchPage.java:3261) at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3342) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3071) at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803) at org.eclipse.ui.internal.Workbench$27.runWithException(Workbench.java:1363) at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31) at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133) at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3342) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3071) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2295) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2200) at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:495) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:490) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504) at org.eclipse.equinox.launcher.Main.run(Main.java:1236) Caused by: Java Model Exception: Java Model Status [src/net/siteduke/windows [in SiteDuke] does not exist] at org.eclipse.jdt.internal.core.JavaElement.newNotPresentException(JavaElement.java:491) at org.eclipse.jdt.internal.core.PackageFragmentRoot.getUnderlyingResource(PackageFragmentRoot.java:678) at org.eclipse.jdt.internal.core.PackageFragment.getUnderlyingResource(PackageFragment.java:337) at org.eclipse.jdt.internal.core.Openable.getUnderlyingResource(Openable.java:333) at org.eclipse.jdt.internal.core.CompilationUnit.getUnderlyingResource(CompilationUnit.java:916) at com.instantiations.designer.core.editor.UndoManager.<init>(UndoManager.java:62) at com.instantiations.designer.core.editor.DesignPage$2.run(DesignPage.java:99) at com.instantiations.designer.core.utils.execution.ExecutionUtils.runRethrow(ExecutionUtils.java:64) ... 52 more !ENTRY org.eclipse.osgi 2 0 2009-06-25 18:56:21.409 !MESSAGE The following is a complete list of bundles which are not resolved, see the prior log entry for the root cause if it exists: !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.409 !MESSAGE Bundle reference:file:plugins/org.eclipse.jdt.apt.pluggable.core_1.0.101.R34x_v20081108-1950.jar [216] was not resolved. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.410 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.tool_0.0.0. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.410 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.dispatch_0.0.0. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.410 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.model_0.0.0. !SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2009-06-25 18:56:21.411 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.util_0.0.0. !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.411 !MESSAGE Bundle reference:file:plugins/org.eclipse.jdt.compiler.apt_1.0.101.R34x_v20090114-1205.jar [218] was not resolved. !SUBENTRY 2 org.eclipse.jdt.compiler.apt 2 0 2009-06-25 18:56:21.412 !MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.tool_0.0.0. !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.412 !MESSAGE Bundle reference:file:plugins/org.eclipse.jdt.compiler.tool_1.0.100.v_894_R34x.jar [219] was not resolved. !SUBENTRY 1 org.eclipse.osgi 2 0 2009-06-25 18:56:21.412 !MESSAGE Bundle reference:file:plugins/com.instantiations.designer.swing.java6_7.0.0.200905010653.jar [417] was not resolved.
In diesem speziellen Fall steckt die nützliche Information hier: org.apache.commons.lang.exception.NestableError: Java Model Exception: Java Model Status [src/net/project/windows [in project] does not exist] Aus irgendeinem Grund kann eclipse eine spezielle Datei nicht mehr auf der Workbench öffnen. Nach einigen Versuchen habe ich dann einen Weg gefunden dieses Problem zu umgehen:
Tip: Lege so häufig wie möglich eine komplette Sicherungskopie Deiner workbench an!
Ach ja – bitte vergiss auf keinen Fall: Du folgst diesem Rat auf eigene Verantwortung
In den letzten Tagen wurde ich des häufigeren gefragt: “Wie konvertiere ich einen string in einen InputStream, sodaß ich meinen XML-String zum Beispiel mit SAX parsen kann?” (Anmerkung: oder natürlich jedem anderen XML-Parser wie DOM, JAXP, JDOM, …).
Um es nicht noch häufiger erklären zu müssen, hier ein Codebeispiel:
1 2 3 4 5 6 7 | String myString = 'content of your very own string'; ByteArrayInputStream in = new ByteArrayInputStream(myString.getBytes()); InputSource is = new InputSource(); is.setByteStream(in); Parser myParser = new Parser(); myParser.parse(is); |
So einfach und schnell funktioniert das in Java