Pakethierarchie bei Ausgabe berücksichtigen #308

Closed
opened 2024-03-29 09:07:26 +00:00 by i21023 · 2 comments
Collaborator

Der javac Compiler liest die Pakethierarchie der einzelnen Klassen aus und bildet diese bei der Ausgabe der Bytecode Datei automatisch wieder ab. Der Java-TX Compiler tut dies aktuell nicht.

Beispiel:

.
└── src
    └── main
        ├── packagea
        │   └── Foo.java
        └── packageb
            └── Bar.java
//Datei Foo.java
package main.packagea;

public class Foo {}
//Datei Bar.java
package main.packageb;

public class Bar {}

Mit javac

Wenn der javac Compiler folgendermaßen aufgerufen wird, legt er automatisch die Pakethierarchie der Klassen im target Order an.

$ javac -d "target" src/main/packageb/Bar.java src/main/packagea/Foo.java

Das resultiert in folgender Dateistruktur:

.
├── src
│   └── main
│       ├── packagea
│       │   └── Foo.java
│       └── packageb
│           └── Bar.java
└── target
    └── main
        ├── packagea
        │   └── Foo.class
        └── packageb
            └── Bar.class

Mit dem Java-TX Compiler

Im Vergleich dazu legt der Java-TX Compiler die Hierarchie nicht an, sondern legt die Dateien einfach in das mit -d angegebene Verzeichnis flach ab.

$ java -jar ../JavaTXcompiler-2.0-jar-with-dependencies.jar -d "target" src/main/packageb/Bar.java src/main/packagea/Foo.java

resultiert in folgender Dateistruktur:

.
├── src
│   └── main
│       ├── packagea
│       │   └── Foo.java
│       └── packageb
│           └── Bar.java
└── target
    ├── Bar.class
    └── Foo.class

Dadurch ist man gezwungen den Compiler für jede Datei einzeln aufzurufen, um die Dateistruktur korrekt wiederherstellen zu können.

$ java -jar ../JavaTXcompiler-2.0-jar-with-dependencies.jar -d "target/main/packagea" src/main/packagea/Foo.java
$ java -jar ../JavaTXcompiler-2.0-jar-with-dependencies.jar -d "target/main/packageb" src/main/packageb/Bar.java

resultiert dann ebenfalls in:

.
├── src
│   └── main
│       ├── packagea
│       │   └── Foo.java
│       └── packageb
│           └── Bar.java
└── target
    └── main
        ├── packagea
        │   └── Foo.class
        └── packageb
            └── Bar.class
Der javac Compiler liest die Pakethierarchie der einzelnen Klassen aus und bildet diese bei der Ausgabe der Bytecode Datei automatisch wieder ab. Der Java-TX Compiler tut dies aktuell nicht. **Beispiel:** ``` . └── src └── main ├── packagea │ └── Foo.java └── packageb └── Bar.java ``` ```java //Datei Foo.java package main.packagea; public class Foo {} ``` ```java //Datei Bar.java package main.packageb; public class Bar {} ``` ___ ### Mit javac Wenn der javac Compiler folgendermaßen aufgerufen wird, legt er automatisch die Pakethierarchie der Klassen im `target` Order an. ```sh $ javac -d "target" src/main/packageb/Bar.java src/main/packagea/Foo.java ``` Das resultiert in folgender Dateistruktur: ``` . ├── src │ └── main │ ├── packagea │ │ └── Foo.java │ └── packageb │ └── Bar.java └── target └── main ├── packagea │ └── Foo.class └── packageb └── Bar.class ``` ### Mit dem Java-TX Compiler Im Vergleich dazu legt der Java-TX Compiler die Hierarchie nicht an, sondern legt die Dateien einfach in das mit `-d` angegebene Verzeichnis flach ab. ```sh $ java -jar ../JavaTXcompiler-2.0-jar-with-dependencies.jar -d "target" src/main/packageb/Bar.java src/main/packagea/Foo.java ``` resultiert in folgender Dateistruktur: ``` . ├── src │ └── main │ ├── packagea │ │ └── Foo.java │ └── packageb │ └── Bar.java └── target ├── Bar.class └── Foo.class ``` Dadurch ist man gezwungen den Compiler für jede Datei einzeln aufzurufen, um die Dateistruktur korrekt wiederherstellen zu können. ```sh $ java -jar ../JavaTXcompiler-2.0-jar-with-dependencies.jar -d "target/main/packagea" src/main/packagea/Foo.java $ java -jar ../JavaTXcompiler-2.0-jar-with-dependencies.jar -d "target/main/packageb" src/main/packageb/Bar.java ``` resultiert dann ebenfalls in: ``` . ├── src │ └── main │ ├── packagea │ │ └── Foo.java │ └── packageb │ └── Bar.java └── target └── main ├── packagea │ └── Foo.class └── packageb └── Bar.class ```
dholle referenced this issue from a commit 2024-04-08 09:40:51 +00:00
Author
Collaborator

Wenn der Zielordner mit -d nicht angegeben wird, sollte sich der Compiler weiter so wie bisher verhalten, also das Classfile neben der Quelldatei ablegen. Durch die Änderungen funktioniert das nun nicht mehr wie gehabt.

Um bei dem Beispiel von oben zu bleiben:

.
└── src
    └── main
        ├── packagea
        │   ├── Foo.class
        │   └── Foo.java
        └── packageb
            ├── Bar.class
            └── Bar.java

Wenn ein Zielordner manuell mit -d angegeben wird, funktioniert es jetzt wie gewünscht (bzw. wie beim Java Compiler). Allerdings nicht mehr, wenn der Zielordner nicht explizit angegeben wird.

$ java -jar ../JavaTXcompiler-2.1-jar-with-dependencies.jar src/main/packagea/Foo.java src/main/packageb/Bar.java

Erwartet:

.
└── src
    └── main
        ├── packagea
        │   ├── Foo.class
        │   └── Foo.java
        └── packageb
            ├── Bar.class
            └── Bar.java

Ausgabe:

.
└── src
    └── main
        ├── packagea
        │   ├── Foo.java
        │   └── main
        │       └── packagea
        │           └── Foo.class
        └── packageb
            ├── Bar.java
            └── main
                └── packageb
                    └── Bar.class


Zusätzlich funktioniert ein ganz normaler Aufruf des Compilers auf eine einzelne Quelldatei aktuell nicht mehr:

//Klasse Bar.jav
class Bar{}

$ java -jar JavaTXcompiler-2.1-jar-with-dependencies.jar Bar.jav

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.io.File.toString()" because "path" is null
        at de.dhbwstuttgart.core.JavaTXCompiler.writeClassFile(JavaTXCompiler.java:773)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:749)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:723)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:705)
        at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:715)
        at de.dhbwstuttgart.core.ConsoleInterface.main(ConsoleInterface.java:40)

Das macht es gerade sehr schwer den Compiler zu verwenden

Wenn der Zielordner mit `-d` nicht angegeben wird, sollte sich der Compiler weiter so wie bisher verhalten, also das Classfile neben der Quelldatei ablegen. Durch die Änderungen funktioniert das nun nicht mehr wie gehabt. Um bei dem Beispiel von oben zu bleiben: ``` . └── src └── main ├── packagea │ ├── Foo.class │ └── Foo.java └── packageb ├── Bar.class └── Bar.java ``` Wenn ein Zielordner manuell mit `-d` angegeben wird, funktioniert es jetzt wie gewünscht (bzw. wie beim Java Compiler). Allerdings nicht mehr, wenn der Zielordner nicht explizit angegeben wird. `$ java -jar ../JavaTXcompiler-2.1-jar-with-dependencies.jar src/main/packagea/Foo.java src/main/packageb/Bar.java` **Erwartet:** ``` . └── src └── main ├── packagea │ ├── Foo.class │ └── Foo.java └── packageb ├── Bar.class └── Bar.java ``` **Ausgabe:** ``` . └── src └── main ├── packagea │ ├── Foo.java │ └── main │ └── packagea │ └── Foo.class └── packageb ├── Bar.java └── main └── packageb └── Bar.class ``` ___ Zusätzlich funktioniert ein ganz normaler Aufruf des Compilers auf eine einzelne Quelldatei aktuell nicht mehr: ```java //Klasse Bar.jav class Bar{} ``` `$ java -jar JavaTXcompiler-2.1-jar-with-dependencies.jar Bar.jav` ``` Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.io.File.toString()" because "path" is null at de.dhbwstuttgart.core.JavaTXCompiler.writeClassFile(JavaTXCompiler.java:773) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:749) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:723) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:705) at de.dhbwstuttgart.core.JavaTXCompiler.generateBytecode(JavaTXCompiler.java:715) at de.dhbwstuttgart.core.ConsoleInterface.main(ConsoleInterface.java:40) ``` Das macht es gerade sehr schwer den Compiler zu verwenden
i21023 reopened this issue 2024-04-09 17:07:26 +00:00
dholle referenced this issue from a commit 2024-04-10 07:43:04 +00:00
Owner

Kannst du es nochmal versuchen?

Kannst du es nochmal versuchen?
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#308
No description provided.