2014-05-16 2 views
5

Ho due progetti Java chiamati A e B. Entrambi sono applicazioni Web distribuite come file di guerra. Li ho creati separatamente nell'area di lavoro di Eclipse. Progetto B utilizza una classe nel progetto A denominata MusicMapper. Ho aggiunto il progetto A per proiettare il percorso di costruzione di B in Eclipse come suggerito in this post. Così ora il progetto B può compilare senza errori e la classe MusicMapper può essere visto in progetto B importando nel progetto B:Come condividere il codice tra due progetti?

import com.projectA.MusicMapper; 

Tutto sembra andare bene, prima ho lanciato l'applicazione web di progetto B. Tuttavia, quando ho lanciato il progetto B e chiamato il codice che fa riferimento classe MusicMapper nel progetto a, ho ottenuto il seguente errore di runtime:

java.lang.ClassNotFoundException: com.projectA.MusicMapper 

Quindi questo errore sembra essere causato da classe unfound com.projectA.MusicMapper che è importato da progetto A. Dal momento che ho già aggiunto il progetto A al progetto B, il percorso di costruzione e il progetto B compila bene senza errori, perché segnala questo errore in fase di esecuzione?

Un altro approccio che ho preso era: Ho anche provato con la seguente importazione Maven nel progetto di B pom.xml:

<dependency> 
     <groupId>com.projectA</groupId> 
     <artifactId>projectA</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <scope>system</scope> 
     <systemPath>/path/to/projectA.jar</systemPath> 
    </dependency> 

dove projectA.jar è il file jar ho esportato dal progetto di A. Ma ancora mi ha dato la stesso ClassNotFoundException. Come posso rendere la classe nel progetto A utilizzabile dal progetto B? Sembra che nessuno dei due approcci che ho provato funzioni.

+0

Pensi che sia una risposta per voi :) – vkg

risposta

5

Prima di tutto se si hanno due progetti che vengono entrambi dispiegati come guerre, non è una buona idea includere un progetto in un altro come dipendenza. Perché sarete puling nel sacco di altre cose che non hai bisogno di progetto B.

Un approccio migliore sarà quello di creare un progetto Java Terzo permette di dire "Comune" questo dovrebbe essere solo un progetto java e NON un progetto Web dinamico e devono essere compilati come jar. Sposta tutto il materiale condiviso tra il Progetto A e il Progetto B in Progetto comune.

ora torna il problema Solo l'aggiunta di qualche cosa al progetto di percorso di generazione in Eclipse non significa aver aggiunto la dipendenza al progetto al di fuori di Eclipse pure. Eclipse non si lamenta perché può risolvere e trovare il progetto perché è stato aggiunto nel percorso di costruzione di Eclipse. Dovrai compilare un progetto di dipendenza comune usando alcuni strumenti di costruzione come formica, maven o gradle e impacchettare il barattolo nel tuo file di guerra una volta costruita la guerra.

Se non si desidera utilizzare uno strumento di compilazione, un percorso semplice potrebbe semplicemente esportare il terzo progetto da Eclipse come jar. Copia il file jar comune nella cartella WEB-INF/lib del tuo Progetto A e Progetto B prima di esportare il file war da eclissi.

Spero che aiuta :)

+0

Grazie. Quindi ho bisogno di spostare la classe 'MusicMapper' dal progetto A e metterla nel progetto" Comune "che è compresso in un barattolo. Ma cosa succede se la classe 'MusicMapper' ha qualche dipendenza da alcune classi del progetto A? Inoltre, c'è un modo in cui posso semplicemente includere il jar esportato dal progetto A nel Maven pom.xml del progetto B? L'ho provato come mostrato sopra ma non ci sono riuscito. – tonga

+0

Un sacco di domande :) Sì, dovresti spostare il MusicMapper sul progetto comune.Ma ora, se scopri che la classe MusicMapper ha molte dipendenze, il risultato è di tirare praticamente tutto il progetto A che riflette un cattivo design nel codice. In tal caso potrebbe essere necessario eseguire alcuni refactoring per la pulizia. Ora torna a parlare. È davvero difficile spiegarlo tutto qui. Ma il concetto di base che durante la creazione di Maven verrà prima compilare il progetto comune e pubblicarlo sul repository locale. E se hai definito correttamente le dipendenze, includerà quel jar quando impacchetterai la guerra del tuo progetto web. – vkg

+0

Sì, credo che se 'MusicMapper' ha un sacco di dipendenze da altre classi di progetto A, allora significa che il design è problematico. Cercherò di impostare un progetto "comune" per le classi condivise comuni tra i progetti A e B. Ma d'altra parte, userà un progetto Maven master che include entrambi i progetti A e B? In questo modo, potrebbe non essere necessario spostare qualsiasi classe in un progetto comune. Ma il lato negativo è che devo configurare correttamente pom.xml del progetto Maven del master. Ho visto persone che lo usano anche in questo modo. – tonga