JDK in Mac OS X Lion

3. August 2011 von Jan Lolling in Java, Mac Fan Club

Apple hat leider bei Java JDK in Lion ein etwas eigenwilliges Deployment angewendet. Wenn mein sein System von Snow Leopard auf Lion aktualisiert wird man erstmal damit konfrontiert, dass Java verschwunden ist. Man muss es – am besten aus der DeveloperConnection – nach installieren.
Der neue Ablageort ist:
/Library/Java/JavaVirtualMachines/
Darunter liegen aber leider nun keine simplen Verzeichnisse mehr sondern bundles. In diese kann man mit normalen Dateiauswahldialogen (z.B. von Eclipse) nicht eintauchen. Bundels sind aber trotzdem nicht wirklich viel mehr als Verzeichnisse mit besonderen Attributen.
Deshalb macht es Sinn – auch unter dem Aspekt der Kompatibilität symbolische Links zu setzen:
Im Verzeichnis /System/Library/Frameworks/JavaVM.framework legt man einen Link:
sudo ln -s /Library/Java/JavaVirtualMachines/1.6.0_26-b03-383.jdk/Contents/Home/ CurrentJDK
Und nun kann man mit in Eclipse dieses verlinkte Verzeichnis auswählen und man hat sein JDK am Start.

  • Kommentare deaktiviert

JUG Ant Task und SQLRunner haben neues Zuhause

11. April 2011 von Jan Lolling in Java

Die ANT Tasks und der SQLRunner sind nun unter dieser URL zu erreichen:
http://www.jan-lolling.de/
Alle Komponenten stehen nach wie vor unter der LGPL zur freien Verwendung.
Der Code der ANT-Task liegt im download Bereich.
Der Code des SQLRunners ist verfügbar auf Github.

  • Kommentare deaktiviert

Java Aktualisierung für Mac OS X [update]

20. Oktober 2010 von Jan Lolling in Java, Mac Fan Club

Seit heute ist die Version 1.6.0_22 für OSX verfügbar. Soweit nichts spektakuläres aber….

Die API für die Integration von Java Apps in OSX hat sich auch geändert und zeigt deutlich die Vorboten des neuen Betriebssystems Lion (10.7).

Insbesondere die neuen Interfaces (alles SubClasses von com.apple.eawt.AppEventListener) zeigen wo es hin geht:

  • AppHiddenListener,
  • AppReOpenedListener,
  • ScreenSleepListener,
  • UserSessionListener,
  • SystemSleepListener

sind ganz auf die Bedürfnisse der neuen Funktionen von OSX ausgerichtet und zeigen, dass Apple Java nicht links liegen lässt sondern weiter entwickelt.

[Update] Apple überträgt seinen Java-VM Code und die Komponenten zur Kopplung mit dem OS an das OpenJDK-Projekt. Damit wird sicher gestellt dass diese Komponenten auch zeitnah Aktualisierungen erfahren – anders als jetzt wo auf OSX doch erheblich später die Updates kamen.

  • Kommentare deaktiviert

ANT tasks der Java User Group

9. Juni 2010 von Jan Lolling in Java, Java Code Beispiele

Ant ist ein überaus mächtiges Werkzeug für die Automatisierung und Sicherstellung des build-Prozesses in immer gleicher Qualität. Zudem ist es sehr leicht anpassbar und erweiterbar.
Hier ein paar Beispiele aus der Java User Group:

Diese Task sind als Binaries und Source code verfügbar und stehen unter der GPL. Da diese Libs nicht in Produkte integriert werden stellt die GPL auch kein Problem für den kommerziellen Einsatz dieser Task dar.

Diese Task sind bereits im produktiven Einsatz in aktuell 3 Projekten (1 Open Source Projekt und 2 Individual Projekte für kommerzielle Zwecke).

Viel Spass beim Ausprobieren.

Wir freuen uns über Anregungen und Kommetare: jan dot lolling at googlemail dot com.

  • Kommentare deaktiviert

JDBC Metadaten für Oracle stored procedures

5. April 2010 von Jan Lolling in Java, Java Code Beispiele
Schlagwörter:

Das Konstrukt der Packages wird durch JDBC nicht wirklich gut unterstützt. JDBC geht leider auch von eindeutigen Namen für functions und procedures aus. Somit hat man ein Problem mit überladenen procedures. Diese unterscheiden sich nicht im Namen sondern in der Anzahl und Typen der Parameter.
Der Oracle-JDBC-Treiber gibt alle Informationen raus, es erfordert nur etwas Geschick diese Informationen einzusammeln.
1. Die Name der packages werden als CATALOG ausgegeben.
2. Die Parameter kennen ihren Index. Wenn ein Parameter für scheinbar die selbe procedure erscheint mit dem gleichen Index, dann ist das ein Zeichen für eine überladene procedure.

Der folgende Beispielcode geht davon aus, dass die procedures und functions in speziellen Objekten gehalten werden und die Parameter besitzen auch ihre eigene Transferklasse.

	/**
	 * load procedure and functions
	 * 
	 * @param schema
	 *            object that represent a schema
	 * @return true if everything went well
	 */
	public boolean loadProcedures(SQLSchema schema) {
		if (logger.isDebugEnabled()) {
			logger.debug("loadProcedures schema=" + schema);
		}
		// makes this thread save
		inRefreshCycle = true;
		boolean ok = false;
		// don' worry about that, we use our own database pool
		final DatabaseSession session = DatabaseSessionPool.getDatabaseSession(cd.getUniqueId());
		if (session == null) {
			// return if no connection to database avialable
			return false;
		}
		try {
			Connection conn = session.getConnection();
			DatabaseMetaData dbmd = conn.getMetaData();
			schema.clearProcedures(); // remove any previously loaded procedures
			ResultSet rs = dbmd.getProcedures(null, schema.getName(), null);
			if (rs != null) {
				// loading all procedures and functions
				while (rs.next()) {
					// PROCEDURE_CAT contains the package name
					String catalogName = rs.getString("PROCEDURE_CAT");
					String name = rs.getString("PROCEDURE_NAME");
					if (catalogName != null && catalogName.length() > 0) {
						name = catalogName + "." + name;
					}
					// create an new one
					SQLProcedure procedure = new SQLProcedure(this, schema,	name);
					// decide if it is a function
					short pType = rs.getShort("PROCEDURE_TYPE");
					procedure.setFunction(pType == DatabaseMetaData.procedureReturnsResult);
					schema.addProcedure(procedure);
					objectMap.put(name, procedure);
				}
				rs.close();
			}
			// loading procedure/function parameters
			rs = dbmd.getProcedureColumns(null, schema.getName(), null, null);
			if (rs != null) {
				// an index for overloaded procedures
				int procedureIndex = 0;
				String prevProcedureName = "noprocedurehere_xx";
				while (rs.next()) {
					// PROCEDURE_CAT contains the package name
					String catalogName = rs.getString("PROCEDURE_CAT");
					String name = rs.getString("PROCEDURE_NAME");
					if (catalogName != null && catalogName.length() > 0) {
						// add the catalog name as package name
						name = catalogName + "." + name;
					}
					int pos = 0;
					try {
						// position of this parameter in the procedure parameter
						// list
						pos = rs.getInt("ORDINAL_POSITION");
					} catch (Exception e) {
						// perhaps this column is not defined in every database
						// type
						pos = -1;
					}
					if (prevProcedureName.equals(name)) {
						if (pos == 0) {
							// if we get the same procedure name and a parameter
							// with position zero increase the procedure index
							// that means point to the next procedure with the
							// same name
							procedureIndex++;
						}
					} else {
						procedureIndex = 0;
					}
					String columnName = rs.getString("COLUMN_NAME");
					List list = schema.getProcedures(name);
					SQLProcedure procedure = list.get(procedureIndex);
					if (procedure != null) {
						procedure.addParameter(columnName, // parameter name
								rs.getShort("DATA_TYPE"),  // parameter type as
														   // integer defined
														   // in class
														   // java.sql.Type
								rs.getString("TYPE_NAME"), // parameter type as
														   // string
								rs.getInt("LENGTH"),    // length of the parameter
														// if parameter is
														// string or number type
								rs.getInt("PRECISION"), // precision of the
														// parameter if the
														// parameter is a number
														// type
								rs.getShort("COLUMN_TYPE")); // input or output
														     // parameter as
														     // integer:
															 // refer
															 // DatabaseMetaData.procedureColumnReturn
					}
					// keep the name of the last procedure to detect overloaded
					// procedures
					prevProcedureName = name;
				}
				rs.close();
			}
			schema.setProcedureLoaded();
			ok = true;
		} catch (SQLException sqle) {
			// creates a error message to show it in GUI
			errorMessage = "loadProcedures schema=" + schema + " failed: "
					+ sqle.getMessage();
		} finally {
			// put the session back in the pool
			DatabaseSessionPool.release(session);
		}
		inRefreshCycle = false;
		return ok;
	}
  • Kommentare deaktiviert

« vorherige Beiträge