# JAR verändern - JAVAC soll einfach nur kompilieren, ohne Prüfungen



## LILA (27. Jan 2012)

Hallo Forum,

ich habe in JAR-File.
In diesem JAR-Files liegen Klassen.
Eine dieser Klassen würde ich gerne geringfügig ändern.
Daher habe ich mir den JD-Decompiler heruntergeladen.
Mit diesem sehe ich mir das class-file als java-file an.
Anschließend kopiere ich das java-File in einen Editor.
Dann nehme ich Änderungen vor und will das geänderte java-file dann wieder compilieren mit javac.
Das geht aber nicht wg. Fehlermeldungen. z.b. 'package oracle.jdbc does not exist' oder 'cannot find symbol'.
Diese Fehlermeldungen sind ja auch nicht verwunderlich, immerhin habe ich ja auch die Pfade nicht richtig gesetzt. 
Gibt es eine Möglichkeit javac zu überreden einfach zu kompilieren, ohne diese Prüfungen durchzuführen.
Will ja nur setLocal für einen JDBC-Zugriff einfügen!

Bin um jeden Rat dankbar.
Vielen Dank im Voraus.

Freundliche Grüße


----------



## bygones (27. Jan 2012)

du brauchst schon alle zur compiletime benoetigten Abhaengigkeiten wenn du es compilieren willst...


----------



## Michael... (27. Jan 2012)

Ich hoffe ich mache mich jetzt nicht strafbar ;-)
Benutzt Du eine Entwicklungsumgebung? Das würde das ganze etwas erleichtern.
Grundsätzlich reicht es aus das jar (bzw. alle notwendigen jars) in den CLASSPATH aufzunehmen (in Eclipse z.B. in den Build Path)
Dann kannst Du einfach einen neue Klasse mit dem selben Namen (Achtung das Package gehört zum Namen) erstellen  und kompilieren.
Die class Datei kannst Du dann wieder ins jar stecken.


----------



## LILA (27. Jan 2012)

Ok, vielen Dank erstmal dafür.

Habe es jetzt mal mit Eclipse versucht.
Naja. Wieder was gelernt. Jetzt habe ich aber ein anderes Problem. 
In den folgenden Code möchte ich Zeile 233 'Locale.setDefault(Locale.GERMAN);' einfügen.
Das ist auch schon alles.
Aber bei mir meckert er dann noch an, dass er die Variable 'localObject' z.B. Zeile 78 nicht findet.
Jetzt habe ich aber sämtliche Bibliotheken eingebunden. Wie konnte es denn vorher kompiliert werden, wenn dieses Objekt nie richtig deklariert war...

Hier mal der sehr lange Code:

```
package oracle.spatial.util;

import java.io.PrintStream;
import java.sql.DriverManager;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.Vector;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;

public class SampleShapefileToJGeomFeature
{
  private static String m_host;
  private static String m_port;
  private static String m_sid;
  private static String m_user;
  private static String m_password;
  private static String m_tableName;
  private static String m_shapefileName;
  private static String m_idName = null;
  private static int m_srid = 0;

  private static String m_geom = "geometry";
  private static String min_x = "-180";
  private static String min_y = "-90";
  private static String max_x = "180";
  private static String max_y = "90";
  private static String m_tolerance = "0.05";
  private static String mg_tolerance = "0.000000005";
  private static int m_start_id = 1;
  private static int m_commit_interval = -1;
  private static int m_println_interval = 10;
  private static String dimArray = null;
  private static String dimArrayMig = null;
  private static boolean defaultX = true;
  private static boolean defaultY = true;

  public static void main(String[] paramArrayOfString)
    throws Exception
  {
    String str1 = "The following key/value is missing: ";
    HashMap localHashMap = new HashMap();

    Vector localVector = new Vector();
    int i = 0;

    if (paramArrayOfString.length <= 1) {
      System.err.println("USAGE: java -cp [ORACLE_HOME]/jdbc/lib/ojdbc14.jar;./sdoutl.jar;./sdoapi.jar SampleShapefileToJGeomFeature -h db_host -p db_port -s db_sid -u db_username -d db_password -t db_table -f shapefile_name [-i table_id_column_name][-r srid][-g db_geometry_column][-x max_x,min_x][-y max_y,min_y][-o tolerance]");
      System.out.println("Usage explanation (parameters used):");
      System.out.println("<-h>: Host machine with existing Oracle database");
      System.out.println("<-p>: Host machine's port with existing Oracle database (e.g. 1521)");
      System.out.println("<-s>: Host machine's SID with existing Oracle database");
      System.out.println("<-u>: Database user");
      System.out.println("<-d>: Database user's password");
      System.out.println("<-t>: Table name for the result");
      System.out.println("<-f>: File name of an input Shapefile (without extension)");
      System.out.println("[-i]: Column name for unique numeric ID; if required");
      System.out.println("[-r]: Valid Oracle SRID for coordinate system; use 0 if unknown");
      System.out.println("[-g]: Preferred or valid SDO_GEOMETRY column name");
      System.out.println("[-x]: Bounds for the X dimension; use -180,180 if unknown");
      System.out.println("[-y]: Bounds for the Y dimension; use -90,90 if unknown");
      System.out.println("[-o]: Load tolerance fields (x and y) in metadata, if not specified, tolerance fields are 0.05");
      System.out.println("[-a]: Append shapefile data to an existing table");
      System.out.println("[-n]: Start ID for column specified in -i parameter");
      System.out.println("[-c]: Commit interval. Default, commits every 1000 conversions and at the end of a run");
      System.out.println("[-v]: Println interval. Default, displays every 10 conversions.");
      System.exit(1);
    }
    else
    {
      for (int j = 0; paramArrayOfString.length > j; j++)
      {
        localVector.add(j, paramArrayOfString[j]);
      }

      for (localObject = localVector.elements(); ((Enumeration)localObject).hasMoreElements(); ) {
        try
        {
          String str3 = (String)((Enumeration)localObject).nextElement();

          if (str3.equals("-a")) {
            i = 1;
          }
          else {
            String str2 = (String)((Enumeration)localObject).nextElement();
            if ((str3 != null) && (str2 != null))
              localHashMap.put(str3, str2);
          }
        }
        catch (Exception localException1)
        {
          System.out.println("One of your key-value pairs failed.  Please try again");
          System.exit(1);
        }
      }
    }

    if (localHashMap.containsKey("-h")) {
      System.out.println("host: " + (String)localHashMap.get("-h"));
      m_host = (String)localHashMap.get("-h");
    }
    else
    {
      System.out.println(str1 + "-h db_host");
      System.exit(1);
    }

    if (localHashMap.containsKey("-p")) {
      System.out.println("port: " + (String)localHashMap.get("-p"));
      m_port = (String)localHashMap.get("-p");
    }
    else
    {
      System.out.println(str1 + "-p db_port");
      System.exit(1);
    }

    if (localHashMap.containsKey("-s")) {
      System.out.println("sid: " + (String)localHashMap.get("-s"));
      m_sid = (String)localHashMap.get("-s");
    }
    else
    {
      System.out.println(str1 + "-s db_sid");
      System.exit(1);
    }

    if (localHashMap.containsKey("-u")) {
      System.out.println("db_username: " + (String)localHashMap.get("-u"));
      m_user = (String)localHashMap.get("-u");
    }
    else
    {
      System.out.println(str1 + "-u db_username");
      System.exit(1);
    }

    if (localHashMap.containsKey("-d")) {
      System.out.println("db_password: " + (String)localHashMap.get("-d"));
      m_password = (String)localHashMap.get("-d");
    }
    else
    {
      System.out.println(str1 + "-d password");
      System.exit(1);
    }

    if (localHashMap.containsKey("-t")) {
      System.out.println("db_tablename: " + (String)localHashMap.get("-t"));
      m_tableName = (String)localHashMap.get("-t");
    }
    else
    {
      System.out.println(str1 + "-t tablename");
      System.exit(1);
    }

    if (localHashMap.containsKey("-f")) {
      System.out.println("shapefile_name: " + (String)localHashMap.get("-f"));
      m_shapefileName = (String)localHashMap.get("-f");
    }
    else
    {
      System.out.println(str1 + "-f shapefile_name");
      System.exit(1);
    }

    if (localHashMap.containsKey("-i")) {
      System.out.println("table_id_column_name: " + (String)localHashMap.get("-i"));
      m_idName = (String)localHashMap.get("-i");
    }

    if (localHashMap.containsKey("-r")) {
      System.out.println("SRID: " + (String)localHashMap.get("-r"));
      m_srid = Integer.parseInt((String)localHashMap.get("-r"));
    }

    if (localHashMap.containsKey("-g")) {
      System.out.println("db_geometry_column: " + (String)localHashMap.get("-g"));
      m_geom = (String)localHashMap.get("-g");
    }

    if (localHashMap.containsKey("-x")) {
      System.out.println("X: " + (String)localHashMap.get("-x"));
      localObject = new StringTokenizer((String)localHashMap.get("-x"), ",");
      while (((StringTokenizer)localObject).hasMoreTokens())
      {
        min_x = ((StringTokenizer)localObject).nextToken();
        max_x = ((StringTokenizer)localObject).nextToken();
        defaultX = false;
      }
    }

    if (localHashMap.containsKey("-y")) {
      System.out.println("Y: " + (String)localHashMap.get("-y"));
      localObject = new StringTokenizer((String)localHashMap.get("-y"), ",");
      while (((StringTokenizer)localObject).hasMoreTokens())
      {
        min_y = ((StringTokenizer)localObject).nextToken();
        max_y = ((StringTokenizer)localObject).nextToken();
        defaultY = false;
      }
    }

    if (localHashMap.containsKey("-o")) {
      System.out.println("tolerance: " + (String)localHashMap.get("-o"));
      m_tolerance = (String)localHashMap.get("-o");
    }

    if (localHashMap.containsKey("-n")) {
      System.out.println("start_id: " + (String)localHashMap.get("-n"));
      m_start_id = Integer.parseInt((String)localHashMap.get("-n"));
    }

    if (localHashMap.containsKey("-c")) {
      System.out.println("commit_interval: " + (String)localHashMap.get("-c"));
      m_commit_interval = Integer.parseInt((String)localHashMap.get("-c"));
    }

    if (localHashMap.containsKey("-v")) {
      System.out.println("println_interval: " + (String)localHashMap.get("-v"));
      m_println_interval = Integer.parseInt((String)localHashMap.get("-v"));
    }

    System.out.println("Connecting to Oracle10g using...");
    System.out.println(m_host + ", " + m_port + ", " + m_sid + ", " + m_user + ", " + m_password + ", " + m_tableName + ", " + m_shapefileName + ", " + m_idName + ", " + m_srid);
    Object localObject = "jdbc:oracle:thin:@ " + m_host + ":" + m_port + ":" + m_sid;
    OracleConnection localOracleConnection = null;
    try
    {
      Locale.setDefault(Locale.GERMAN);
      DriverManager.registerDriver(new OracleDriver());
      localOracleConnection = (OracleConnection)DriverManager.getConnection((String)localObject, m_user, m_password);
      localOracleConnection.setAutoCommit(false);
    } catch (Exception localException2) {
      localException2.printStackTrace();
    }

    DBFReaderJGeom localDBFReaderJGeom = new DBFReaderJGeom(m_shapefileName);
    ShapefileReaderJGeom localShapefileReaderJGeom = new ShapefileReaderJGeom(m_shapefileName);
    ShapefileFeatureJGeom localShapefileFeatureJGeom = new ShapefileFeatureJGeom();

    int k = localShapefileReaderJGeom.getShpFileType();
    double d1 = localShapefileReaderJGeom.getMinMeasure();
    double d2 = localShapefileReaderJGeom.getMaxMeasure();
    if (d2 <= -9.999999999999999E+038D)
      d2 = (0.0D / 0.0D);
    double d3 = localShapefileReaderJGeom.getMinZ();
    double d4 = localShapefileReaderJGeom.getMaxZ();

    if (defaultX)
    {
      if (!ShapefileFeatureJGeom.isGeodetic(localOracleConnection, m_srid))
      {
        min_x = String.valueOf(localShapefileReaderJGeom.getMinX());
        max_x = String.valueOf(localShapefileReaderJGeom.getMaxX());
      }
    }

    if (defaultY)
    {
      if (!ShapefileFeatureJGeom.isGeodetic(localOracleConnection, m_srid))
      {
        min_y = String.valueOf(localShapefileReaderJGeom.getMinY());
        max_y = String.valueOf(localShapefileReaderJGeom.getMaxY());
      }

    }

    int m = ShapefileReaderJGeom.getShpDims(k, d2);

    dimArray = ShapefileFeatureJGeom.getDimArray(m, m_tolerance, min_x, max_x, min_y, max_y, d3, d4, d1, d2);
    dimArrayMig = ShapefileFeatureJGeom.getDimArray(m, mg_tolerance, min_x, max_x, min_y, max_y, d3, d4, d1, d2);

    if (i == 0)
      ShapefileFeatureJGeom.prepareTableForData(localOracleConnection, localDBFReaderJGeom, m_tableName, m_idName, m_geom, m_srid, dimArray);
    else {
      System.out.println("Appending to existing table\n");
    }

    ShapefileFeatureJGeom.insertFeatures(localOracleConnection, localDBFReaderJGeom, localShapefileReaderJGeom, m_tableName, m_idName, m_start_id, m_commit_interval, m_println_interval, m_srid, dimArrayMig);

    localDBFReaderJGeom.closeDBF();
    localShapefileReaderJGeom.closeShapefile();
    localOracleConnection.close();
  }
}
```


----------



## bygones (27. Jan 2012)

bevor du tief in irgendwelche libs reingehst nur um die Local zu aendern, du kannst auch beim Aufruf des jars die Locale setzen

zb
[c]java -Duser.country=ES -Duser.language=es -jar theJar.jar[/c]


----------



## LILA (27. Jan 2012)

Dankeschön für die Hilfe. Aber leider funktioniert es bei dem Skript irgendwie nicht.
So rufe ich es auf:


```
java -Duser.country=de -Duser.language=de -cp /pfad/ojdbc14.jar:/pfad/sdoutl.jar:/pfad/sdoapi.jar oracle.spatial.util.SampleShapefileToJGeomFeature -h $Host -p $Port -s $SID -u user -d pw -t test_import -f $1 -i ID -r $6 -x $2,$3 -y $4,$5 -g geom
```

Das ganze sieht etwas komisch aus, da ich es aus einem Shell-Skript aufrufe. 
Der eigentliche Import funktioniert.
Ich versuche nämlich ein Shapefile (räumliche Geodaten) in eine Oracle-DB zu importieren.
Aber meine ä, ö und üs werden immer in verdrehte ? konvertiert.
Ansonsten funktioniert es ganz gut.

Bin am verzweifeln... Doch noch irgendeine Idee?
Könnte es daran liegen, dass in der Klasse 'SampleShapefileToJGeomFeature' ursprünglich gar nix als Local gesetzt wird?
So kann ich vielleicht auch durch Duser.country und Duser.language keine Änderung vornehmen?


----------



## Michael... (27. Jan 2012)

LILA hat gesagt.:


> Aber leider funktioniert es bei dem Skript irgendwie nicht.
> So rufe ich es auf:
> 
> 
> ...


Fehlt da nicht noch ein 
	
	
	
	





```
-jar
```
?

Zur dekompilierten Klasse. Nobody is perfect. Die Dekompiler können nicht alles wirklich sauber dekompilieren. In Deinem Fall scheint an ein paar Ecken etwas schief gegangen zu sein. Sieht so aus als gingen ein paar Variablendeklarationen flöten. Allerdings liese sich das recht schnell selbst beheben (sofern da nicht noch andere Fehler drin sind)


----------



## bygones (27. Jan 2012)

ich denke der aufruf ist einfach zu lang, da wurde dann abgeschnitten...

mhm ich tippe ins Blaue [c]-Duser.country=DE[/c] ? also gross schreiben.

mhm ist es deine Oracle DB ? moeglich dass du dort das richtige Schema setzen musst ? vielleicht ist der Fehler nicht in der lib... bin aber leider kein DB experte


----------



## LILA (27. Jan 2012)

Ich bin mir nicht sicher, ob dieses '-jar' bei mir den gewünschten Erfolg bringen kann.
Hatte es gerade mal probiert wir folgt:

```
java -Duser.country=de -Duser.language=de -jar -cp /pfad/ojdbc14.jar:/pfad/sdoutl.jar:/pfad/sdoapi.jar oracle.spatial.util.SampleShapefileToJGeomFeature ...
```

Allerdings bekam ich folgende Fehlermeldung:


> Unable to access jarfile oracle.spatial.util.SampleShapefileToJGeomFeature



Kann jetzt sein, dass ich total auf dem Schlauch stehe, aber müsste mein -cp nicht reichen?
Ich will ja eine spezielle Klasse, nämlich 'SampleShapefileToJGeomFeature' aufrufen.
Irgendwas habe ich da glaube ich noch nicht verstanden? Wo stehe ich auf dem Schlauch?

In der Anleitung zu dem Tool ist beschrieben, dass ich es durch java -cp .... aufrufen soll, siehe:
Loading ESRI Shapefiles into Spatial


----------



## bygones (27. Jan 2012)

wenn alle jars im Classpath stehen, dann brauchst du kein -jar extra. Dann rufst du einfach die Klasse auf, das ist an sich richtig


----------



## Michael... (27. Jan 2012)

Sorry, hatte nicht genau hingeschaut und gesehen, dass Du den CLASSPATH setzt und die Klasse direkt aufrufst.
D.h. das Programm startet aber an der Locale ändert sich nichts?


----------



## LILA (27. Jan 2012)

Danke nochmal.

Groß schreiben bringt leider nix.

Es ist nicht ganz alleine meine Datenbank, aber sie steht hier bei uns ;-)

Ich hatte es ursprünglich versucht über NLS_LANG, das ist eine Umgebungsvariable, welche die Codierung der Datenbank beeinflusst. Aber diese wertet Java hier beim Import anscheinend nicht aus...

Keine Ahnung, bin wirklich ratlos.

Noch eine Idee, wie ich das 'localObjekt' in meinem Java-File deklarieren müsste, damit ich es vielleicht doch mal mit einem neuen Class-File probieren könnte...?

[EDIT]Genau, an der Local ändert sich nichts, kann ich diese Local auf der Konsolenebene irgendwie auslesen?
Um mal zu sehen, was da so standardmäßig drin ist?

In Java-Code würde es über eine Get-Methode gehen, kann ich diese in der Konsole ansprechen?[/EDIT]


----------



## Michael... (27. Jan 2012)

So wie es aussieht wurden mehrere Variablen nicht deklariert und localObjekt ist Platzhalter für verschiedene Variablen. Aber eigentlich sollte es ausreichen diese als Object zu deklarieren, da in dem dekompilierten Code an den notwendigen Stellen immer in den passenden Typ gecastet wird.

[EDIT]Ganz vergessen: Was versuchst Du eigentlich mit der Umstellung der Locale zu erreichen?[/EDIT]


----------



## irgendjemand2 (27. Jan 2012)

das problem dürfte der code selbst sein den JAD generiert hat ...

du kannst das file z.b. noch mal neu de-compilen und dabei den parameter "-ff" angeben ... das beduetet : alle fields die irgendwo deklariert werden *und das wird Object localObject ... nämlich genau 4 zeilen über deinem Locale* am anfang der klasse deklariert werden ...

es liegt also nicht daran das Object localObject garnicht sondern einfach an der falschen stelle deklariert wird ...

leider ist JAD da nicht so intiligent um das von sich aus zu korrigieren .. aber mit FieldsFirst *-ff* beim compilen dürfte es dein problem lösen ...


----------



## Evil-Devil (27. Jan 2012)

LILA hat gesagt.:


> Ich versuche nämlich ein Shapefile (räumliche Geodaten) in eine Oracle-DB zu importieren.
> Aber meine ä, ö und üs werden immer in verdrehte ? konvertiert.


Ich weiß leider nicht ob das auch für Oracle DB gilt, aber in MySQL kann über direkt über SQL Anweisungen das eingehende Characterset Encoding einstellen und die Tabelle in die man die Daten importiert sollte natürlich das passende Characterset Encoding besitzen.

zb. für utf8
[sql]set names 'utf8'[/sql]


----------



## LILA (30. Jan 2012)

Ich danke euch allen für eure Hilfe.
Leider klappt es irgendwie trotzdem nicht. 
Werde nun auf ein anderes Tool umsteigen.
Aber danke für den Beistand...


----------



## LILA (30. Jan 2012)

Für alle die evtl. das selbe Problem haben:

Funktioniert hat der Import letztlich mit -Dfile.encoding=ISO-8859-1


----------

