# Auf anderes Projekt zugreifen



## DerSchokoBär (25. Sep 2012)

Hallo Community,

ich versuche gerade auf einen anderen Projektfad zuzugreifen.
Das sieht ungefähr so aus:
Test/src/main/test.java         (meine eigentliche Klasse mit der ich versuche auf die andere zuzugreifen)
Test2/src/Entities/test2.java


```
private static final String ENTITIES_PACKAGE=test2.class.getPackage().getName();
private static final String ENTITIES_DIR="???/src/" + ENTITIES_PACKAGE.replace('.', '/');
```

Ich benutze Eclipse (RSA) und habe das Projekt _Test2_ dem Projekt _Test_ schon per _Eigenschaften_ -> _Buildpath_ hinzugefügt.
Jetzt fragt sich wie die *ENTITIES_DIR* aussieht damit ich auf das andere Projekt zugreifen kann.

Danke schon im voraus
DerSchokoBär


----------



## maki (25. Sep 2012)

> ich versuche gerade auf einen anderen Projektfad zuzugreifen./quote]
> Was genau verstehst du unter "Projektpfad"?
> 
> Was hast du mit den Konstanten ENTITIES_PACKAGE & ENTITIES_DIR eigentlich vor??


----------



## DerSchokoBär (25. Sep 2012)

Mit den beiden Konstanten wird dann weitergerabeitet, um nach Entites zu suchen. Das funktioniert auch wunderbar im eigenen Projekt. Nun möchte ich aber andere Projekte danach durchsuchen.

Ich habe zwei völlig unabhängige Projekte. D.h. ich habe ein Projekt _Test_ mit dem Package main und ein Projekt _Test2_ mit dem Package Entities. Mit dem einen Projekt will ich das andere Projekt nach Entities durchsuchen, dazu bräuchte ich doch einen Projektpfad zu dem anderen Projekt?


----------



## TryToHelp (25. Sep 2012)

Dann Packe dein erstes Projekt, welches du im zweiten verwenden willst in eine Jar und verwende es im zweiten Projekt als externe jar bzw libary


----------



## maki (25. Sep 2012)

> Mit den beiden Konstanten wird dann weitergerabeitet, um nach Entites zu suchen.


Ok, aber nicht so...



> Das funktioniert auch wunderbar im eigenen Projekt.


Höchstens aus der IDE.

Wenn deine Projekte fertig sind, wirst du wohl den Quellcode kaum mitausliefern und deswegen bringt dir ein Pfad der mit src beginnt gar nix, sondern du wirst Jars ausliefern, und in Jars gibt es keine Dateien, sondern nur Entries.

Alles in allem bist du auf dem holzweg.

Was für "Entities" meinst du jetzt eigentlich?


----------



## DerSchokoBär (25. Sep 2012)

Das soll auch alles innerhalb der IDE (RSA) funktionieren. Mir geht es nur darum, wie ich jetzt innerhalb der IDE auf das andere Projekt zugreifen kann.


----------



## bone2 (25. Sep 2012)

aber warum  warum macht man sowas


gehen sollte es, in eclipse, wenn beide projekte offen sind, du das 2. projekt im ersten projekt als Required im Buildpath hinzufügst


----------



## DerSchokoBär (25. Sep 2012)

Es sollte insgesamt ein RSA-Projekt sein.

Ich habe es ja schon wie gesagt hinzugefügt. Nun muss ich ja aber irgendwie einen Pfad angeben.


----------



## bone2 (25. Sep 2012)

projekte kennen sich gegenseitig nicht, sie liegen zwar im selben workspace, aber wenn du den projektnamen (was über java + eclipse so nicht geht) nicht rausbekommst, kommst du nicht ins nachbarprojekt.


----------



## DerSchokoBär (25. Sep 2012)

Projektnamen weiß ich.


----------



## bone2 (25. Sep 2012)

naja dann ist es doch das eigene (workspace) verzeichnis + projektnamen + src + packagezeugs
oder wie ist dein pfad beim eigenen projekt?


```
String curDir = System.getProperty("user.dir");
        curDir = curDir.replace("testarea", "Entities");
        String ENTITIES_PACKAGE=SubscriptionInfo.class.getPackage().getName();
        String ENTITIES_DIR=curDir+ "\\src\\" + ENTITIES_PACKAGE.replace('.', '\\');
        System.out.println(ENTITIES_DIR);
```


----------



## DerSchokoBär (26. Sep 2012)

Mh erst einmal danke, aber ich komme auf keinen grünen Zweig.


```
private static String PATH= "C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1";
private static String ENTITIES_PACKAGE=Mitarbeiter.class.getPackage().getName();
private static String ENTITIES_DIR=PATH+ "/src/" + ENTITIES_PACKAGE.replace('.', '/');  

File entitiesDirectory=new File(".",ENTITIES_DIR);
		 
for(String classFile:entitiesDirectory.list()) { //Zeile 126
    ...
}
```

Bei der Ausgabe von ENTITIES_DIR am Ende bekomme ich dann auch den korrekten Pfad:
C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/src/Entities

bekomme aber dann:

```
Exception in thread "main" java.lang.NullPointerException
at main.Auslesen.EntityAnnotation(Auslesen.java:126)
```


Habe es dann auch mal mit ClassLoader versucht:

```
public class InspectClass {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws ClassNotFoundException, MalformedURLException {
        
        System.out.println("test");
        
        File fileDir = new File("C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/bin/Entities/");
        //File customElementsDir = new File("D:\\customElements");
        URL[] urls = null;
        try {
            URL url = fileDir.toURI().toURL();
            urls = new URL[] { url };
            URLClassLoader ucl = new URLClassLoader(urls);
            Class c = ucl.loadClass("IndependentClass"); // LINE 14
            for(Field f: c.getDeclaredFields()) {
                    System.out.println("Field name" + f.getName());
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
}
```

scheitere aber genauso und bekomme folgende Fehlermeldung:

```
Exception in thread "main" java.lang.ClassNotFoundException: IndependentClass
	at java.net.URLClassLoader.findClass(URLClassLoader.java:419)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:643)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:609)
	at main.InspectClass.main(InspectClass.java:22)
```


----------



## bone2 (26. Sep 2012)

DerSchokoBär hat gesagt.:


> Mh erst einmal danke, aber ich komme auf keinen grünen Zweig.
> 
> 
> ```
> ...


naja dann ist entitiesDirectory an der stelle eben null, hat ja nicht mit dem eigentlichen problem zu tun. 
oder steht 
	
	
	
	





```
File entitiesDirectory=new File(".",ENTITIES_DIR);
```
 in zeile 125?


----------



## DerSchokoBär (26. Sep 2012)

> naja dann ist entitiesDirectory an der stelle eben null, hat ja nicht mit dem eigentlichen problem zu tun.


Sollte ja aber nicht null sein, wenn der Pfad korrekt ist und es dort die Dateien gibt.



> oder steht File entitiesDirectory=new File(".",ENTITIES_DIR); in zeile 125?


Nein.


Wie sieht es mit der zweiten Möglichkeit aus?


----------



## bone2 (26. Sep 2012)

```
File entitiesDirectory=new File(".",ENTITIES_DIR);
```
da kommt aber "C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/./C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/src/Entities" raus
lass das "." parent weg

log ftw

```
System.out.println(entitiesDirectory.getAbsolutePath());
```


----------



## DerSchokoBär (26. Sep 2012)

Ausgabe:

```
C:\Documents and Settings\DerSchokoBaer\IBM\rationalsdp\workspace\RSATest1\src\Entities
```
Ha! Danke das wars danke! :applaus:

Wie würde das dann mit der zweiten Möglichkeit richtig funktionieren mit dem classLoader?


----------



## bone2 (26. Sep 2012)

gucke gerade, vielleicht auch noch ein schreibfehler? liegt die IndependentClass wirklich in 
	
	
	
	





```
.../bin/Entities/
```
?


```
File fileDir = new File("e:/w2/testarea/bin/");
        //File customElementsDir = new File("D:\\customElements");
        URL[] urls = null;
        try {
            URL url = fileDir.toURI().toURL();
            System.out.println(url);
            urls = new URL[] { url };
            URLClassLoader ucl = new URLClassLoader(urls);
            Class c = ucl.loadClass("Test"); // LINE 14
            for(Field f: c.getDeclaredFields()) {
                System.out.println("Field name" + f.getName());
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
```

funktioniert bei mir


----------



## Noctarius (26. Sep 2012)

Also in Eclipse liegen die Class Files normal nicht unter src, ergo wird dein Classloader die auch nicht lesen können.


----------



## DerSchokoBär (26. Sep 2012)

in 
	
	
	
	





```
C:/Documents and Settings/tg/IBM/rationalsdp/workspace/RSATest1/bin/Entities
```
 liegen zwei Klassen eine Mitarbeiter.class und eine Wohnort.class


```
File fileDir = new File("C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/bin/Entities");
 
        URL[] urls = null;
        try {
            URL url = fileDir.toURI().toURL();
            System.out.println(url);
            urls = new URL[] { url };
            URLClassLoader ucl = new URLClassLoader(urls);
            Class c = ucl.loadClass("Mitarbeiter"); 
            for(Field f: c.getDeclaredFields()) {
                System.out.println("Field name" + f.getName());
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
```


----------



## bone2 (26. Sep 2012)

DerSchokoBär hat gesagt.:


> in
> 
> 
> 
> ...



und? funktionierts wenn du eine Klasse nimmst, die auch existiert?


----------



## DerSchokoBär (26. Sep 2012)

Wie muss ich das angeben?


----------



## Noctarius (26. Sep 2012)

Wie jede andere Klasse auch und dann musst du halt in deinem Classloader (das ist btw kein Anfängerkram) entsprechend den Pfad anhand des Canonical Path der Klasse auflösen und das File laden.


----------



## bone2 (26. Sep 2012)

hast du doch schon, das letzte was du gepsotet hast, sollte funktionieren. den Klassennamen (Mitarbeiter) hast du an der richtigen stelle eingetragen


----------



## DerSchokoBär (26. Sep 2012)

Also hier mein Code (vorher hatte ich im Pfad den letzten Slash vergessen):

```
public class InspectClass {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws ClassNotFoundException, MalformedURLException {
        
        System.out.println("test");
        
        File fileDir = new File("C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/bin/Entities/");
 
        URL[] urls = null;
        try {
            URL url = fileDir.toURI().toURL();
            System.out.println(url);
            urls = new URL[] { url };
            URLClassLoader ucl = new URLClassLoader(urls);
            Class c = ucl.loadClass("Mitarbeiter"); 
            for(Field f: c.getDeclaredFields()) {
                System.out.println("Field name" + f.getName());
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
```

Fehlermeldung (irgendwas stimmt mit _Mitarbeiter_ nicht, wegen dem wrong name):

```
test
file:/C:/Documents%20and%20Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/bin/Entities/
Exception in thread "main" java.lang.NoClassDefFoundError: Mitarbeiter (wrong name: Entities/Mitarbeiter)
	at java.lang.ClassLoader.defineClassImpl(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:265)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:493)
	at java.net.URLClassLoader.access$300(URLClassLoader.java:64)
	at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:892)
	at java.security.AccessController.doPrivileged(AccessController.java:284)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:414)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:643)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:609)
	at main.InspectClass.main(InspectClass.java:23)
```


----------



## bone2 (26. Sep 2012)

achja, mitarbeiter liegt in nem package


```
File fileDir = new File("C:/Documents and Settings/DerSchokoBaer/IBM/rationalsdp/workspace/RSATest1/bin/");

Class c = ucl.loadClass("Entities.Mitarbeiter");
```


----------



## DerSchokoBär (26. Sep 2012)

Vielen Dank euch beiden


----------

