Mit Ant erstelltes jar funktioniert nicht wie direkt in Eclipse

Hans_Steiger

Mitglied
Hallo,

ich arbeite an einem Projekt, in welchem ich auf eine MySQL Datenbank zugreife. Wenn ich das Projekt über Eclipse ausführe funktioniert alles wunderbar. Nun habe ich zum ersten mal versucht, ein Jar zu erstellen. Das erstellen funktioniert, aber wenn ich das jar starte funktioniert die Datenbankanbindung nicht. Ich erhalte folgenden Fehler:

Java:
Exception in thread "main" java.lang.reflect.InvocationTargetException
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:597)
at com.eteks.sweethome3d.SweetHome3DBootstrap.main(Unknown Source)
Caused by: java.lang.ExceptionInInitializerError
at com.mysql.jdbc.Util.stackTraceToString(Util.java:355)
at com.mysql.jdbc.Util.<clinit>(Util.java:120)
at com.mysql.jdbc.NonRegisteringDriver.parseURL(NonRegisteringDriver.java:729)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:296)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at com.eteks.sweethome3d.io.Database.connect(Unknown Source)
at com.eteks.sweethome3d.SweetHome3D.monitoringModeLoader(Unknown Source)
at com.eteks.sweethome3d.SweetHome3D.init(Unknown Source)
at com.eteks.sweethome3d.SweetHome3D.main(Unknown Source)
... 5 more
Caused by: java.lang.RuntimeException: Can't load resource bundle due to underlying exception java.util.MissingResourceException: Can't find bundle for base name com.mysql.jdbc.LocalizedErrorMessages, locale fr_FR
at com.mysql.jdbc.Messages.<clinit>(Messages.java:61)
... 15 more
Caused by: java.util.MissingResourceException: Can't find bundle for base name com.mysql.jdbc.LocalizedErrorMessages, locale fr_FR
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1427)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1250)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:705)
at com.mysql.jdbc.Messages.<clinit>(Messages.java:59)
... 15 more

Ich habe das ganze schon unter Windows und Mac und mit verschiedenen Kombinationen von JDBC und JRE ausprobiert.

Hat jemand eine Idee, woran das liegen könnte?

Viele Grüße
 
meine glaskugel sagt mir das in deinem ant-script die properties-datei mit dne zugangsdaten zur db nicht mitkopiert wurde
 
Die Zugangsdaten sind direkt per String in der java Datei hinterlegt.

Wenn ihr Code braucht wäre es gut, wenn ihr mir sagen würdet von welchen Stellen. Ich möchte euch hier ungern mit Code zu spammen.
 
Also die in der Build.xml zugeordnete manifest ist völlig leer:

Java:
Manifest-Version: 1.0 
Created-By: 1.5 (Sun Microsystems, Inc)
Main-Class: com.eteks.sweethome3d.SweetHome3DBootstrap

Aber das in dem Projekt noch andere Libraries sind und diese Funktionieren gehe ich davon aus, dass die irgendwie anders eingebunden werden. Aber ich kann mal probieren sie der manifest hinzuzufügen. Wie funktioniert das?

Hier noch die build.xml:
[XML] <?xml version="1.0"?> <!-- build.xml Sweet Home 3D, Copyright (c) 2007- - Pastebin.com
 
hast die jar mla entpackt und geguckt was jetzt wirklich drin geladet ist?

min im manifest wäre was richtung:
[XML]Manifest-Version: 1.0
Rsrc-Class-Path: ./ javax.persistence_2.0.0.jar jgraphx.jar jdbcblabla.jar
eclipselink.jar
Class-Path: .
Rsrc-Main-Class: de.firma.projekt.Klasse
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

[/XML]
 
Zuletzt bearbeitet:
Das Manifest in der jar sieht genauso aus wie das oben. Wenn ich das jetzt richtig verstehe werden die Klassen dynamisch zur Laufzeit geladen:

Java:
/*
 * SweetHome3DBootstrap.java 2 sept. 07
 *
 * Sweet Home 3D, Copyright (c) 2007 Emmanuel PUYBARET / eTeks <info@eteks.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package com.eteks.sweethome3d;

import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.eteks.sweethome3d.tools.ExtensionsClassLoader;

/**
 * This bootstrap class loads Sweet Home 3D application classes from jars in classpath 
 * or from extension jars stored as resources.
 * @author Emmanuel Puybaret
 */
public class SweetHome3DBootstrap {
  public static void main(String [] args) throws MalformedURLException, IllegalAccessException, 
        InvocationTargetException, NoSuchMethodException, ClassNotFoundException {
    Class sweetHome3DBootstrapClass = SweetHome3DBootstrap.class;
    List<String> extensionJarsAndDlls = new ArrayList<String>(Arrays.asList(new String [] {
        "iText-2.1.7.jar", // Jars included in Sweet Home 3D executable jar file 
        "freehep-vectorgraphics-svg-2.1.1.jar",
        "Loader3DS1_2u.jar",
        "sunflow-0.07.3g.jar",
        "jmf.jar",
        "batik-svgpathparser-1.7.jar",
        "jnlp.jar",
        "jcommon-1.0.17.jar", //Monitoring Mode jars
        "jfreechart-1.0.17.jar",
        "mysql-connector-java-5.1.18-bin.jar",
        "j3dcore.jar", // Main Java 3D jars
        "vecmath.jar",
        "j3dutils.jar",
        "macosx/gluegen-rt.jar", // Mac OS X jars and DLLs
        "macosx/jogl.jar",
        "macosx/libgluegen-rt.jnilib",
        "macosx/libjogl.jnilib",
        "macosx/libjogl_awt.jnilib",
        "macosx/libjogl_cg.jnilib" }));
    if ("64".equals(System.getProperty("sun.arch.data.model"))) {
      extensionJarsAndDlls.add("linux/x64/libj3dcore-ogl.so"); // Linux 64 bits DLLs
      extensionJarsAndDlls.add("windows/x64/j3dcore-ogl.dll"); // Windows 64 bits DLLs
    } else {
      extensionJarsAndDlls.add("linux/i386/libj3dcore-ogl.so"); // Linux 32 bits DLLs
      extensionJarsAndDlls.add("linux/i386/libj3dcore-ogl-cg.so"); // Windows 32 bits DLLs
      extensionJarsAndDlls.add("windows/i386/j3dcore-d3d.dll");
      extensionJarsAndDlls.add("windows/i386/j3dcore-ogl.dll");
      extensionJarsAndDlls.add("windows/i386/j3dcore-ogl-cg.dll");
      extensionJarsAndDlls.add("windows/i386/j3dcore-ogl-chk.dll");
    }
    
    String [] applicationPackages = {
        "com.eteks.sweethome3d",
        "javax.media",
        "javax.vecmath",
        "com.sun.j3d",
        "com.sun.opengl",
        "com.sun.gluegen.runtime",
        "javax.media.opengl",
        "com.sun.media",
        "com.ibm.media",
        "jmpapps.util",
        "com.microcrowd.loader.java3d",
        "org.sunflow",
        "org.apache.batik",
        "com.mysql.jdbc"};
    ClassLoader java3DClassLoader = new ExtensionsClassLoader(
        sweetHome3DBootstrapClass.getClassLoader(), 
        sweetHome3DBootstrapClass.getProtectionDomain(),
        extensionJarsAndDlls.toArray(new String [extensionJarsAndDlls.size()]), applicationPackages);  
    
    String applicationClassName = "com.eteks.sweethome3d.SweetHome3D";
    Class applicationClass = java3DClassLoader.loadClass(applicationClassName);
    Method applicationClassMain = 
      applicationClass.getMethod("main", Array.newInstance(String.class, 0).getClass());
    // Call application class main method with reflection
    applicationClassMain.invoke(null, new Object [] {args});
  }
}

Dort habe ich auch die von mir verwendeten Bibliotheken hinzugefügt.
 

Zurück
Oben