NetBeans 6.7beta mit neuem Look&Feel für Mac OSX

22. Mai 2009 von Jan Lolling in Java, Mac Fan Club

NetBeans 6.7 glänzt mit einem komplett überarbeiteten Look&Feel für Mac OSX. So empfiehlt sich NetBeans nun auch für Mac OS X als RCP-Plattform.

netbeans67beta_osx

  • Kommentare deaktiviert

Java Anwendungen verpackt als deb-package

21. Mai 2009 von Jan Lolling in Java, Java Code Beispiele

Debian packages sind so ziemlich das eleganteste was es an Verteilungsmechanismen für Software gibt. Diese Art der Softwareverteilung steht auch für Java-Anwendungen zur Verfügung. Idealerweise macht man das innerhalb des build-Prozesses z.B. in Ant.
Hier wird nun kurz ein sehr hilfreicher Ant-Task vorgestellt.
Für eine Desktop-Anwendung unter Linux werden zum einen die eigentlichen Programm-Dateien benötigt als auch eine Datei (.desktop) die das Programm in den Menüs von KDE oder Gnome bekannt macht und zudem den Komfort bietet das Programm auch gleich für die Behandlung von Mimetypes zu registrieren. Es ist also kein Fummeln an irgendeiner Registry erforderlich, diese Zuordnung steht in der desktop-Datei und Gnome/KDE erkennen das automatisch.
Hier der Link zu dem Ant-Task bei Google-Code
Es sind genau genommen 2 Ant-Tasks erforderlich:

  • desktopentry erstellt die .desktop-Datei
  • deb erstellt das Debian-Archiv

Beide sind im Projekt sehr gut dokumentiert.
Hier ein Beispiel-Ant-task:

    <target name="deb" depends="jar" description="build the i386 deb file">
        <delete failonerror="false" >
            <fileset dir="${distrib}">
                <include name="sqlrunner*.deb" />
                <include name="sqlrunner*.desktop" />
            </fileset>
        </delete>
        <taskdef name="desktopentry" classname="com.googlecode.ant_deb_task.DesktopEntry"/>
        <desktopentry
            toFile="${distrib}/sqlrunner.desktop"
            name="SQLRunner"
            comment="Database SQL Client"
            icon="/usr/local/sqlrunner/sqlrunner.png"
            exec="/usr/local/sqlrunner/sqlrunner.sh %f"
            type="Application"
            terminal="false"
            mimeType="text/x-sql"
            path="/usr/local/sqlrunner"
            categories="Development;"
        />
        <taskdef name="deb" classname="com.googlecode.ant_deb_task.Deb"/>
        <deb
            todir="${distrib}"
            package="sqlrunner"
            section="devel"
            architecture="all"
            depends="sun-java5-jre|sun-java6-jre">
            <version upstream="${version}"/>
            <maintainer name="Jan Lolling" email="jan.lolling@mac.com"/>
            <description synopsis="Java based database client">
SQLRunner is a Java programm to handle database with a easy to use SQL interface.
.
The SQLRunner has advanced import and export capabilities. 
.
SQLRunner ships with a large number of JDBC driver (e.g. Oracle, Postgres, DB2, MS-SQL, Informix, Derby, Sybase, MaxDB, MySQL).
.
Download at SourceForge: 
.
http://sourceforge.net/projects/jugbbsqlrunner/
.
Homepage for Java Web Start:
.
http://web.me.com/jan.lolling/SQLRunner/SQLRunner.html
 
            </description>
            <tarfileset dir="${lib}" prefix="usr/local/sqlrunner">
                <include name="hsqldb.jar" />
                <include name="ifxjdbc.jar" />
                <include name="jconn3.jar" />
                <include name="ldapjdbc.jar" />
                <include name="ojdbc14.jar" />
                <include name="sqljdbc.jar" />
                <include name="mssql2000_jdbc.jar" />
                <include name="mysql-connector-java-5.1.5-bin.jar" />
                <include name="postgresql-8.2-506.jdbc2.jar" />
                <include name="sapdbc-7_6_00_30_5567.jar" />
                <include name="looks-2.1.4.jar" />
                <include name="liquidlnf.jar" />
                <include name="log4j-1.2.15.jar" />
                <include name="servlet.jar" />
                <include name="ui.jar" />
                <include name="derby.jar" />
                <include name="db2jcc4.jar" />
                <include name="db2jcc_license_cu.jar" />
                <include name="poi-3.1-FINAL-20080629.jar" />
                <include name="jnlp.jar" />
            </tarfileset>
            <tarfileset file="${distrib}/sqlrunner2.jar" prefix="usr/local/sqlrunner"/>
            <tarfileset file="${src}/sqlrunner.png" prefix="usr/local/sqlrunner"/>
            <tarfileset file="${src}/sqlrunner.sh" prefix="usr/local/sqlrunner" filemode="755"/>
            <tarfileset file="${distrib}/sqlrunner.desktop" prefix="usr/share/applications"/>
        </deb>
    </target>

Hinweise zum desktopentry-Task:
Da man leider nicht direkt die Extention einer Datei referenzieren kann, muss man wenn man sein Programm für einen Dateityp registrieren lassen will erst den passenden mime-type finden. Gnome war so nett in den Dateiattributen z.B. für SQL-Scripte den mime-type text/x-sql zu nennen.
Das Attribute “categories” beschreibt in welchem Menü später der Eintrag auftauchen soll. Es gibt festgelegte Hauptmenüpunkte – diese werden englisch vorgegeben.

Hinweise zum deb-Task:
Bei der Synopsis ist zu beachten, dass der Punkt in eigener Zeile eine Leerzeile provoziert ohne den Punkt selbst darzustellen.
Besonders hervorzuheben ist das depends-Attribute. Hier kann man z.B. vorgeben welche packages zuvor installiert werden müssen (was dann auch automatisch getan wird. Im Fall von Java-Anwendungen sichern wir hier die Existenz der virtuellen Maschiene ab. Das Pipe ist als Oder-Verknüpfung zu verstehen.
Ein deb-Archiv ist im Grunde sehr einfach. Es enthält die Dateien genauso wie sie auf dem Zielsystem auch vorhanden sein sollen. Die tarfilesets enthalten also hier alle notwendigen Dateien (inklusive der zuvor erstellten desktop-Datei). Die Pfadangaben sind allesamt relativ zu / (deshalb fehlt irritierenderweise das /-Symbol -> Kein Fehler !)

  • Kommentare deaktiviert

Fritzbox Firmware update

27. März 2009 von Jan Lolling in Mac Fan Club

AVM hat mit seinem neuesten Firmware update ein nerviges Problem für Mac Benutzer behoben. Es gab DNS Probleme im Zusammenhang mit dem Safari-Browser. Diese Probleme haben zu Verzögerungen des Verbindungaufbaues geführt. Das neue Update (29.04.70) beseitigt diese Probleme zuverlässig.

  • Kommentare deaktiviert

JEditorPane mit Zeilenhervorhebung

7. Februar 2009 von Jan Lolling in Java, Java Code Beispiele
Schlagwörter: , ,

Ich habe für meinen Editor eine Möglichkeit gesucht die aktuelle Zeile unter dem Cursor vollständig mit einer anderen Hintergrundfarbe hervorzuheben. Diese Möglichkeit habe ich folgendermassen realisiert:

Zusammenfassung:

Der JEditorPane füge ich einen speziellen CaretListener hinzu der bei Veränderungen des Cursors einen wiederum für die aktuelle Zeile einen Highlighter einrichtet. Das besondere ist der als innere Klasse realisierte HightlighterPainter. Dieser ist so entwickelt, dass er die ganze Zeile unabhängig von der Zeichenanzahl also auf die sichtbare Breite des Editors hervorhebt.

Hier nun der Quelltext des CaretListeners:

package sqlrunner.text;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
 
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.plaf.TextUI;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import javax.swing.text.LayeredHighlighter;
import javax.swing.text.Position;
import javax.swing.text.Utilities;
import javax.swing.text.View;
 
public class HighlightCurrentLineCaretListener implements CaretListener {
 
    static final Color DEFAULT_COLOR = new Color(230, 230, 250);
 
    private Highlighter.HighlightPainter painter;
 
    private Object highlight;
 
    public HighlightCurrentLineCaretListener() {
 
        this(null);
    }
 
    public HighlightCurrentLineCaretListener(Color highlightColor) {
 
        Color c = highlightColor != null ? highlightColor : DEFAULT_COLOR;
        this.painter = new LineHighlightPainter(c);
    }
 
    public void caretUpdate(CaretEvent evt) {
 
        final JTextComponent comp = (JTextComponent) evt.getSource();
        if (comp != null &amp;&amp; this.highlight != null) {
            comp.getHighlighter().removeHighlight(this.highlight);
            this.highlight = null;
        }
        int pos = comp.getCaretPosition();
        final Element elem = Utilities.getParagraphElement(comp, pos);
        int start = elem.getStartOffset();
        int end = elem.getEndOffset();
        try {
            this.highlight = comp.getHighlighter().addHighlight(start,
                                                                end,
                                                                this.painter);
            comp.repaint();
        } catch (BadLocationException ex) {
            ex.printStackTrace();
        }
    }
 
    /**
     * Simple highlight painter that fills a highlighted area with
     * a solid color.
     */
    public static class LineHighlightPainter extends
        LayeredHighlighter.LayerPainter {
 
        private Color color;
 
        /**
         * Constructs a new highlight painter. If <code>c</code> is null,
         * the JTextComponent will be queried for its selection color.
         *
         * @param c
         *            the color for the highlight
         */
        public LineHighlightPainter(Color c) {
 
            this.color = c;
        }
 
        /**
         * Returns the color of the highlight.
         *
         * @return the color
         */
        public Color getColor() {
 
            return this.color;
        }
 
        // --- HighlightPainter methods ---------------------------------------
        /**
         * Paints a highlight.
         *
         * @param g
         *            the graphics context
         * @param offs0
         *            the starting model offset &gt;= 0
         * @param offs1
         *            the ending model offset &gt;= offs1
         * @param bounds
         *            the bounding box for the highlight
         * @param c
         *            the editor
         */
        public void paint(Graphics g, int offs0, int offs1, Shape bounds,
                          JTextComponent c) {
 
            final Rectangle alloc = bounds.getBounds();
            try {
                // --- determine locations ---
                TextUI mapper = c.getUI();
                final Rectangle p0 = mapper.modelToView(c, offs0);
                final Rectangle p1 = mapper.modelToView(c, offs1);
 
                // --- render ---
                if (getColor() == null) {
                    g.setColor(c.getSelectionColor());
                } else {
                    g.setColor(getColor());
                }
                final Rectangle r = p0.union(p1);
                g.fillRect(r.x, r.y, r.width, r.height);
            } catch (BadLocationException e) {
                // can't render
            }
        }
 
        // --- LayerPainter methods ----------------------------
        /**
         * Paints a portion of a highlight.
         *
         * @param g
         *            the graphics context
         * @param offs0
         *            the starting model offset &gt;= 0
         * @param offs1
         *            the ending model offset &gt;= offs1
         * @param bounds
         *            the bounding box of the view, which is not
         *            necessarily the region to paint.
         * @param c
         *            the editor
         * @param view
         *            View painting for
         * @return region drawing occured in
         */
        @Override
        public Shape paintLayer(Graphics g, int offs0, int offs1, Shape bounds,
                                JTextComponent c, View view) {
 
            if (getColor() == null) {
                g.setColor(c.getSelectionColor());
            } else {
                g.setColor(getColor());
            }
            // Should only render part of View.
            try {
                // --- determine locations ---
                Shape shape = view.modelToView(
                                               offs0,
                                               Position.Bias.Forward,
                                               offs1,
                                               Position.Bias.Backward,
                                               bounds);
                Rectangle r = shape instanceof Rectangle ? (Rectangle) shape
                        : shape.getBounds();
                g.fillRect(r.x, r.y, c.getWidth(), r.height);
                return r;
            } catch (BadLocationException e) {
                // can't render
            }
            return null;
        }
    }
}

Diesen CaretListener muss man nun mit:

textComp.addCaretListener(new HighlightCurrentLineCaretListener());

der Textkomponente hinzufügen. Hat bei mir ausgezeichnet funktioniert. Ich habe diesen Code unter Mac OS X und Windows getestet und er läuft abwärts bis Java 5.

  • Kommentare deaktiviert

Tomcat 6 mehrfach auf einem Server betreiben

14. September 2008 von Jan Lolling in Java
Schlagwörter: , , , ,

Diese Beitrag gibt einen Aspekt der Tomcat-Installation wieder, wie er von Peter Roßbach auf der Berlin.ja empfohlen wurde.

Hintergrund: Die Nutzung einer Tomcat-Instanz pro Anwendung hat den Vorteil, dass die zentralen Ressourcen und Konfigurationen optimal für die Anwendung einzustellen kann. Ressourcenprobleme einer Webapp können so keine weitere Webapp betreffen.

Die Nutzung von mehreren Tomcat-Instanzen führt aber nicht zu einer mehrfachen Ablage der immer gleichen Tomcat-Bibliotheken. Der Tomcat bietet eine sehr elegante Möglichkeit der Trennung von Tomcat-Kernkomponenten und anwendungsspezifischen Teile.

Der Tomcat referenziert die Kernkomponenten ausschliesslich über die Variable “CATALINA_HOME” und die Konfigurationsdaten, temporären Dateien und Webapps über die Variable “CATALINA_BASE”.

Um nun ein neue Tomcat-Instanz zu erstellen legt man am besten neben der ursprünglichen Tomcat-Installation ein weiteres Verzeichnis an z.B. /opt/tomcat-node0 neben /opt/apache-tomcat-6.0.18. In dem neuen node0 Verzeichnis werden die Verzeichnisse conf, temp, webapps, work angelegt.

In conf liegt die Tomcat-Konfiguration. Hier alle Dateien aus der orginalen Installation hinein kopieren. Dann legen wir noch ein Verzeichnis bin an und erstellen dort Start- und Stop-Script. Hier sind ein paar lauffähige Beispiele: startup.sh und shutdown.sh

Im Verzeichnis conf muss nun die server.xml angepasst werden. Die Ports dürfen nicht identisch bleiben mit dem orignalen Tomcat (sofern dieser selbst gestartet werden soll). Hier muss man sich ein Schema überlegen, wie man systematisch die Ports verändert (erleichtert den Überblick, wenn man die Nummer der Tomcat-Instanz und die originalen Portnummern zum neuen Ports kombinieren kann.

Der neue Tomcat 6 ist im Vergleich zu der Version 5 oder gar 4 wesentlich leichtgewichtiger und übersichtlicher strukturiert, so dass es sich wirklich anbietet die Trennung der Anwendungen noch radikaler zu betreiben.

<!--:de-->server.xml<!--:-->
Titel : server.xml
Beschriftung : Tomcat-Serverkonfiguration
Dateiname : server.xml
Size : unknown
<!--:de-->shutdown.sh<!--:-->
Titel : shutdown.sh
Beschriftung : Stopscript für eine separate Tomcat-Instanz
Dateiname : shutdown.sh
Size : unknown
<!--:de-->startup.sh<!--:-->
Titel : startup.sh
Beschriftung : Startscript für eine separate Tomcat-Instanz
Dateiname : startup.sh
Size : unknown
  • Kommentare deaktiviert

« vorherige Beiträge nächste Beiträge »