# Erstellen Sie ein Projekt, das die JAR-Datei in seinem Klassenpfad verwendet...



## jono (30. Apr 2020)

Ich soll eine Jar Datei mit class path in eclipse einbinden, wie mache ich das? Unser Dozent hat uns nur über die Kommandozeile gezeigt wie man class path anwendet aber nicht in der Entwicklungsumgebung . Kann mir da bitte einer weiterhelfen?


----------



## thecain (30. Apr 2020)

eclipse add jar to classpath - Google Suche


----------



## jono (4. Mai 2020)

So kann ich die jar Datei auf jeden fall nicht öffnen.


----------



## kneitzel (4. Mai 2020)

@jono was genau willst du denn machen?

Das was beschrieben wurde ist das einbinden der jar Datei bei einem Projekt in Eclipse.

Und sorry - zuerst hatte ich paar Threads verwechselt - hier geht es natürlich um Deine Thematik!


----------



## jono (4. Mai 2020)

Aufgabe 1:
This package contains the interface IntMaths and its implementation in the class IntMathsImpl. The task is  

create a project that uses the JAR file on its class path


----------



## jono (4. Mai 2020)

also inder jar Datei ist eine klasse enthalten und drei mathematische Funktionen, geht das auch mit einem decompiler?


----------



## jono (4. Mai 2020)

und als 2. soll man:
write a class that calls the three functions and prints the result on System.out


----------



## thecain (4. Mai 2020)

Wieso öffnen? Ich sehe nirgends was davon, dass du sie öffnen sollst


----------



## kneitzel (4. Mai 2020)

Also für die Aufgabe brauchst du keinen Decompiler. Du kannst die Klassen direkt nutzen, wenn die jar Dateien im classpath enthalten sind.

Dazu kannst du die schon gezeigte Suche nutzen, ein Treffer war https://www.edureka.co/community/4028/how-to-import-a-jar-file-in-eclipse

Wenn du in eine jar Datei rein schauen möchtest, dann kannst du diese umbenennen in .zip und dann mit einem Programm Deiner Wahl öffnen. Aber wenn die die Klassen kennst, die in den jar Dateien drin sind, dann sehe ich da keinen Nutzen.


----------



## jono (4. Mai 2020)

Ich kenne die klassen nicht da steht nur wie die Klasse heißt in der datei. Okay vielen dank. Ja nicht öffnen, sondern anzeigen, wie JustNoBody sagt. Ich werde es jetzt mal versuchen.


----------



## jono (4. Mai 2020)

Es ist einfach nur so dass die Übung verlangt eine jar datei anzuzeigen und die mathematischen Funktionen in einer anderen klasse aufruft


----------



## thecain (4. Mai 2020)

Nein, du sollst die Funktionen in der jar aufrufen...


----------



## jono (4. Mai 2020)

Ja so meine ich es doch sorry 😀


----------



## jono (4. Mai 2020)

So habe Ich es gemacht und so klappt es bei mir nicht


----------



## jono (4. Mai 2020)

Ich sende gleich mal ein Foto rein, wo man sieht was entstanden ist.


----------



## jono (4. Mai 2020)

Das


----------



## jono (4. Mai 2020)

Und nach unten gescrollt erscheint noch das hier.


----------



## thecain (4. Mai 2020)

Das ist doch kein jar...


----------



## jono (4. Mai 2020)

Das Problem ist die jar datei ist in einer zip datei, da man aber bei dem vorgehen über build path eine datei anklicken muss, wird diese direkt verwendet und in dieser ist dann eije lib und eine doc und eine pdf datei vorhanden


----------



## jono (4. Mai 2020)

Bin neu in dem Kurs, wäre gut wenn mir jemand auf die Sprünge hilft, ich weiß schon was jar ist usw darum macht euch keine Sorgen auch wenn bisher nicht unbedingt erkennbar war.


----------



## thecain (4. Mai 2020)

Entpack die zip datei und nimm die jar aus dem lib ordner...


----------



## jono (4. Mai 2020)

okay entpackt habe ich sie, aber wie nehme ich die Datei aus dem lib ordner?


----------



## thecain (4. Mai 2020)

draufklicken...


----------



## jono (4. Mai 2020)

Okay hat alles funktioniert aber jetzt steht dort so etwas...


----------



## jono (4. Mai 2020)

Wie kommt es dazu?


----------



## thecain (4. Mai 2020)

Wieso willst du das jetzt anschauen? Dazu brauchst du die source oder einen Decompiler... Du sollst es aber verwenden.

Liest du überhaupt was wir schreiben?


----------



## jono (4. Mai 2020)

Ja ich lese was ihr schreibt. Wäre gut wenn du diesen Satz gerade nicht so abstrakt formuliert hättest, das Problem ist, ich soll es verwenden okay...
Was heißt denn jetzt verwenden, meinst du das in Bezug auf die 2. Aufgabe? Also deiner Aussage nach brauche ich jetzt keinen Decompiler und soll einfach eine andere Klasse erstellen in der ich diese Funktionen aufrufe ?


----------



## thecain (4. Mai 2020)

genau


----------



## jono (4. Mai 2020)

Gut, aber wie mache ich das jetzt?


----------



## jono (4. Mai 2020)

In der Vorlesung wird dazu weder ein Beispiel gemacht noch wird sowas in irgendeiner Form abstrahiert angeschnitten.


----------



## jono (4. Mai 2020)

Es wird einfach gesagt  , dass 3 Funktionen mithilfe von Sytem.out. aufgerufen werden sollen...


----------



## thecain (4. Mai 2020)

Nein, da steht ausgegeben, nicht aufrufen mit Hilfe von System.out. Erstell einfach eine Instanz von IntMathImpl und ruf die Funktionen auf. Wie bei jeder Klasse aus dem jdk auch... Sonst geh bei den Vorlesungen nochmal ein paar Folien zurück. Mir wirds gerade ein bisschen zu doof...


----------



## jono (4. Mai 2020)

Och komm schon... Wie erstelle ich denn davon eine Instanz?


----------



## jono (4. Mai 2020)

Jetzt hast du selbst gesagt dass sie aufgerufen werden sollen


----------



## jono (4. Mai 2020)

Das ist doch genau das worum es mir hier geht, die 2. Aufgabe stellt das größte Problem dar und wenn der Prof dann sowas sagt wie: Wir wollen euch nicht ins kalte Wasser werfen wir wollen das ihr schwimmen lernt , na herzlichen Glückwunsch, deshalb frage ich ja auch hier nach, wird wahrscheinlich, wenn man weiß wie keine Schwierigkeit sein, weshalb es doch echt gerechtfertigt wäre wenn du mir dass erklären könntest..


----------



## jono (4. Mai 2020)

Instanz wäre dann ja durch ein Import des packages wie im Screenshot möglich. Dann habe ich "IntMathsImpl intmaths = new IntMathsImpl();" in der Form die Instanz erzeugt.
Die Instanz ist nun erzeugt, wie aber gebe ich jetzt aus ?
Wenn ich wenigstens die Methodennamen der jar Datei wüsste, könnte ich ja durch ein import des packages  der MathIntImpl Klasse durch System.out.println(MathIntImpl.get(Methodenname)) die funktionen ausgeben... Bitte um Hilfe


----------



## kneitzel (5. Mai 2020)

Also Eclipse bietet eine Auto Vervollständigung.
Wenn du also schon eine Instanz intmaths hast, dann kannst Du einmal schreiben: `intmaths.` und dann drückst Du Strg + Leertaste und dann sollte Dir Eclipse die Möglichkeiten anzeigen.

Schau Dir am Besten auch mal








						Die wichtigsten Eclipse Tastenkombinationen und Shortcuts
					

Mit den richtigen Tasten kommt man bei Eclipse schneller ans Ziel. Hier die wichtigsten Shortcuts, die umständliches Herumklicken überflüssig machen. Grundlagen und Navigation Shift+F2 Die Kontexth…




					leonidassokoridas.wordpress.com
				



an wenn du mit Eclipse arbeiten möchtest.


----------



## jono (5. Mai 2020)

Okay, habe ich gemacht und was genau ist jetzt die Instanz von IntMathsImpl? Wie bilde ich die in einer anderen Klasse? Vor allem wie rufe ich jetzt die Funktionen aus der Klasse auf ?


----------



## jono (5. Mai 2020)

Mir ist gerade aufgefallen, es gibt ja einmal die IntMaths.class und die IntMathsImpl.class, die IntMaths.class ist ein interface, jetzt habe ich
die 3 Funktionen aufgerufen in dem ich auf

```
public class Functions implements IntMaths
```
Functions wurde rot unterkringelt, wo drunter stand: Add unimplemented methods, das habe ich dann gemacht und es sind dann folgende Methoden entstanden:

```
public class Functions implements IntMaths {
 public static void main(String[] args) {
  System.out.println(IntMathsImpl.class);
 }
 @Override
public int gcd(int arg0, int arg1) {
// TODO Auto-generated method stub
return 0;
 }
 @Override
public int sqrt(int arg0) {
// TODO Auto-generated method stub
return 0;
 }
 @Override
public int square(int arg0) {
// TODO Auto-generated method stub
return 0;
 }
```
Wie gebe ich jetzt das Ergebnis über System.out aus ?


----------



## kneitzel (5. Mai 2020)

Das ist doch so wie überall.

Du hast eine beliebige Klasse (ich nenne meine Klasse mal Test) mit einer beliebigen Methode (ich nehme mal die static main Methode). Und da kannst Du Instanzen einer Klasse erzeugen (Ich nehme mal die Klasse String) und darauf Methoden aufrufen (Ich nehme mal einfach die Methode length):


```
public class Test {
  public static void main(String[] args) {
    String testInstanz = new String("abc");
    int length = testInstanz.length();
    System.out.println(length);
  }
}
```


----------



## jono (5. Mai 2020)

```
public static void main(String[] args) {
IntMaths result = new IntMaths();
int gcd = result.gcd(gcd, gcd);
  System.out.println(gcd);
 }
```
 Warum wird IntMaths rot unterstrichen?


----------



## fhoffmann (5. Mai 2020)

jono hat gesagt.:


> Warum wird IntMaths rot unterstrichen?


Weil es ein Interface ist und du davon keine Instanz erstellen kannst.


----------



## kneitzel (5. Mai 2020)

IntMaths ist ein Interface und Du kannst keine Instanz von einem Interface erzeugen. Du wolltest vielleicht
`IntMaths result = new IntMathsImpl();`
schreiben.

Und das 
`int gcd = result.gcd(gcd, gcd);`
macht wenig Sinn. Du definierst gcd ja erst. Was willst Du denn bei result.gcd genau übergeben?


----------



## temi (5. Mai 2020)

jono hat gesagt.:


> This package contains the interface IntMaths and its implementation in the class IntMathsImpl.
> Write a class that calls the three functions and prints the result on System.out


Es steht doch alles haarklein da:

Das Package enthält das Interface IntMaths und seine Implementation in der Klass IntMathsImpl.
Schreibe eine Klasse, die die drei (im Interface enthaltenen) Methoden aufruft und gib das Ergebnis auf System.out aus.

Beispiel mit Interface, Implementation und Ausgabe:

```
// fürs Beispiel nur eine Methode, keine drei
interface Foo {
    int add(int value1, int value2);
}

class FooImpl implements Foo {
    @Override
    public int add(int value1, int value2) {
        return value1 + value2;
    }
}

class Test {
    Foo foo = new Foo();
    
    int result = foo.add(41, 1);
    System.out.println(result);
}
```

Sag mal @jono, wir haben im Dezember doch seitenlang über äußere und innere Klassen und Milchprodukte geschrieben. Und jetzt weißt du immer noch nicht, wie man die Instanz einer Klasse erzeugt und Methoden darauf aufruft?


----------



## temi (5. Mai 2020)

`Foo foo = new Foo();` muss natürlich `Foo foo = new FooImpl();` sein.


----------



## thecain (5. Mai 2020)

temi hat gesagt.:


> Sag mal @jono, wir haben im Dezember doch seitenlang über äußere und innere Klassen und Milchprodukte geschrieben. Und jetzt weißt du immer noch nicht, wie man die Instanz einer Klasse erzeugt und Methoden darauf aufruft?


Wenn man sich alles vorkauen lässt, lernt man halt nix, hier ist der lebende Beweis...


----------



## jono (6. Mai 2020)

@temi Ich weiß wie man Instanzen einer Klasse erzeugt. Das Problem ist dass ich es länger nicht mehr gemacht habe. Außerdem habe ich das mit dem Interface selbst herausbekommen und ich habe lediglich oben etwas versucht, weil ich das in Zusammenhang mit einer Interface einfach nicht mehr wusste. Du musst doch nicht gleich so antworten.

```
Foo foo = new Foo(); muss natürlich Foo foo = new FooImpl(); sein.
```
Warum jetzt nicht Foo foo = new Foo(); ? So kenne ich das nämlich


----------



## jono (6. Mai 2020)

@JustNobody Zwei Integers


JustNobody hat gesagt.:


> IntMaths ist ein Interface und Du kannst keine Instanz von einem Interface erzeugen. Du wolltest vielleicht
> `IntMaths result = new IntMathsImpl();`
> schreiben.
> 
> ...


----------



## jono (6. Mai 2020)

@thecain Alles vorkauen ist auch etwas übertrieben, ich wusste es nicht im zusammenhang mit einem interface hab das einfach nicht mehr in erinnerung gehabt, es ist nicht so das ich alles vergessen habe, genau im Gegenteil habe vieles hier gelernt und behalten auch das mit Instanzerzeugung ist ja kein Problem eigentlich nur ich frage lieber nach bevor ich da etwas falsch mache. und wenn ich dann ein wenig falsch mache , bekommt man dann so eine Antwort . 

```
Nein, da steht ausgegeben, nicht aufrufen mit Hilfe von System.out. Erstell einfach eine Instanz von IntMathImpl und ruf die Funktionen auf. Wie bei jeder Klasse aus dem jdk auch... Sonst geh bei den Vorlesungen nochmal ein paar Folien zurück. Mir wirds gerade ein bisschen zu doof...
```
Hier sagst du ich soll eine Instanz von IntMathImpl erstellen. Dazu brauche ich erstmal den Namen der Methode, in dem ich "class Functions implements IntMaths {}" benutze, erst so bringt mir die instanzerzeugung etwas.


----------



## kneitzel (6. Mai 2020)

Wenn Du da zwei Integer übergeben willst, dann mach das doch. Also entweder übergibst du da direkt ein Integer Literal oder du definierst Variablen, denen Du erst einmal einen Wert zuweist.

Die deklarierte Variable gcd nutzt du da, ohne dass ihr ein Wert zugewiesen wurde. Bei einer lokalen Variable müsste da eigentlich der Compiler meckern, denn lokale Variablen sind nicht vorab mit 0 initialisiert (wie es z.B. bei Instanzvariablen der Fall wäre).


----------



## jono (6. Mai 2020)

Okay gut.


----------



## mihe7 (6. Mai 2020)

jono hat gesagt.:


> Alles vorkauen ist auch etwas übertrieben, ich wusste es nicht im zusammenhang mit einem interface hab das einfach nicht mehr in erinnerung gehabt, es ist nicht so das ich alles vergessen habe, genau im Gegenteil habe vieles hier gelernt und behalten auch das mit Instanzerzeugung ist ja kein Problem eigentlich nur ich frage lieber nach bevor ich da etwas falsch mache. und wenn ich dann ein wenig falsch mache , bekommt man dann so eine Antwort .


Genau das ist das von @thecain angesprochene Problem: man lernt Programmieren nicht dadurch, dass man bestimmte "Situationen" auswendig lernt, sondern indem man Grundlagen und deren Zusammenhänge _versteht_. Daraus leitet sich vieles ganz von alleine ab.


----------



## temi (6. Mai 2020)

jono hat gesagt.:


> @temi Ich weiß wie man Instanzen einer Klasse erzeugt. Das Problem ist dass ich es länger nicht mehr gemacht habe. Außerdem habe ich das mit dem Interface selbst herausbekommen und ich habe lediglich oben etwas versucht, weil ich das in Zusammenhang mit einer Interface einfach nicht mehr wusste. Du musst doch nicht gleich so antworten.
> 
> ```
> Foo foo = new Foo(); muss natürlich Foo foo = new FooImpl(); sein.
> ...


Weil Foo ein Interface ist und ein Interface kann man nicht instantiieren.


----------



## temi (6. Mai 2020)

jono hat gesagt.:


> Dazu brauche ich erstmal den Namen der Methode, in dem ich "class Functions implements IntMaths {}" benutze, erst so bringt mir die instanzerzeugung etwas.


Das ist doch Quatsch. Du hast ein Interface und du hast eine Klasse, die bereits das Interface implementiert. Du sollst keine eigene Klasse schreiben, die das Interface implementiert, sondern die vorgegebene Klasse verwenden. Punkt. 

Und ich gehe davon aus, dass man im Studium lernt, dass und wie man sich präzise ausdrückt. Und genau das solltest du auch machen. Es ist nun mal ein Unterschied zwischen "aufrufen mit Hilfe von System.out" und "Methoden aufrufen und das Ergebnis ausgeben".


----------



## jono (7. Mai 2020)

Ne den Unterschied hat uns keiner gesagt. Das muss schon von einem selbst ausgehen. Aber wenn man es nun Mal nicht ganz kapiert fragt man doch Mal nach? In Aufgabe 2 steht doch aber ,dass man eine Klasse schreiben soll, die die drei Funktionen aufruft aus der JAR und die Ergebnisse über System.out ausgibt genau das habe ich doch gemacht? #54 ist etwas allgemein formuliert.


----------



## jono (7. Mai 2020)

Oder meinst du es so,dass ich eine eigene Klasse schreiben soll, in der ich Instanzen erzeuge und über die Main über system.out dann die jeweiligen Funktionen Aufrufe ?


----------



## temi (7. Mai 2020)

jono hat gesagt.:


> In Aufgabe 2 steht doch aber ,dass man eine Klasse schreiben soll, die die drei Funktionen aufruft aus der JAR und die Ergebnisse über System.out ausgibt genau das habe ich doch gemacht?



In Java kann Code nur *innerhalb* einer Klasse ausgeführt werden. Um eine Klasse wirst du also nicht herumkommen.  In dieser Klasse, genauer gesagt, in der main() Methode, instantiierst du die gegebene Klasse und rufst die Funktionen auf. Die Ergebnisse gibst du dann mittels System.out auf der Konsole aus.

Was du jetzt genau gemacht hast, kann ich dir nicht sagen. Hier hast du noch wenig Sinnvolles davon gezeigt. Aber nach mindestens fünf Monaten Java lernen, sollte das nicht die geringsten Probleme machen.


----------



## mihe7 (7. Mai 2020)

Da ich das momentan nur am Rande mitbekomme: geht es immer noch um "write a class that calls the three functions and prints the result on System.out"?!?


----------



## temi (7. Mai 2020)

mihe7 hat gesagt.:


> Da ich das momentan nur am Rande mitbekomme: geht es immer noch um "write a class that calls the three functions and prints the result on System.out"?!?


*Ironie ein* Das ist immerhin ein ziemlich komplexes Problem. Da kommt nicht jeder mit klar. *Ironie aus*

Edit: Ironie eingefügt, nicht das er denkt, das wäre wirklich komplex.


----------



## mihe7 (7. Mai 2020)

Man kann sich ja nicht alles merken.


----------



## temi (7. Mai 2020)

mihe7 hat gesagt.:


> Man kann sich ja nicht alles merken.


Wohl wahr, und Instanzen sind ja auch tückische kleine Dinger...


----------



## jono (10. Mai 2020)

@temi genau das was du in #57 sagst meine ich auch, ich habe nicht Gesagt dass Code außerhalb einer Klasse ausgeführt werden kann. Und sorry, kann ja auch mal daran liegen dass ich deine Formulierungen nicht ganz präzise deuten kann. Was auch hier der Fall war. @temi Du hast ja gesagt aufrufen mit Hilfe von System.out" und "Methoden aufrufen und das Ergebnis ausgeben" ist ein Unterschied, wie in dek Fall jetzt ist es mir erst klar geworden ab diesem Beitrag was mit Methode aufrufen in dieser Aufgabe genau gemeint ist, ich dachte nämlich, dass ich die Methoden aufzeigen soll. Teilweise waren die Antworten etwas unspezifisch sind zwar auf meine Frage gut eingegangen, aber die Fragen, die ich dann teilweise gestellt habe waren schon offensichtlich damit vorprogrammiert etwas zu tun, was nicht in der Aufgabe verlangt war. Und das führt widerrum dazu, dass später wieder einer sagt"Was machst du denn da? Liest du überhaupt was wir schreiben "


----------

