2012-06-27 2 views
7

Sono uno sviluppatore .NET che deve utilizzare la piattaforma Java per un nuovo progetto.Come organizzi una soluzione Java in più progetti, come in Visual Studio?

"Soluzioni" sono un utile concetto di Visual Studio. Come posso interrompere la mia soluzione Java in "progetti" (suppongo pacchetti Java) che hanno creato interdipendenze nello stesso repository di controllo del codice sorgente?

Stiamo pianificando di utilizzare Maven per le dipendenze di terze parti e Scala per scrivere alcune delle librerie.

Abbiamo anche bisogno di essere indipendenti dall'IDE.

Raccomandazioni ricevute con gratitudine!

Modifica: supponiamo che la soluzione conterrà un'applicazione Web, un'applicazione console e una libreria scritta in Scala.

risposta

9

Ho creato un modello simile che è possibile studiare.

Utilizzando Maven sarà come IDE-agnostico che può. Non dovrai memorizzare alcuna specifica IDE nel tuo VCS, solo il codice sorgente e i file pom. Ogni sviluppatore lancerà il suo IDE e indicherà il migliore e il progetto dovrebbe caricarsi. Verranno create le impostazioni locali, ma dovrebbero essere ignorate quando si esegue il commit su VCS.

Prima di tutto un progetto Maven multi modulo avrà sicuramente un layout molto simile a una soluzione C# con i suoi progetti. La cartella principale con il genitore-pom sarà come la soluzione con le configurazioni condivise e l'ordine di compilazione ecc. Quindi le sottocartelle con i sotto-poms corrisponderanno alle definizioni del progetto con le dipendenze tra altri progetti.

directory layout

+- pom.xml 
+- scala 
| +- pom.xml 
| +- src 
| +- main 
|  +- scala 
+- console 
| +- pom.xml 
| +- src 
| +- main 
|  +- java 
+- web 
    +- pom.xml 
    +- src 
    +- main 
    +- java 
    +- resources 
    +- webapp 
     +- WEB-INF 
     -- web.xml 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.stackoverflow</groupId> 
    <artifactId>Q11226363</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <name>${project.artifactId}-${project.version}</name> 

    <properties> 
     <scala.version>2.9.2</scala.version> 
    </properties> 

    <modules> 
     <module>scala</module> 
     <module>web</module> 
     <module>console</module> 
    </modules> 

    <dependencyManagement> 
     <dependencies> 
      <!-- Inter-Module dependencies --> 
      <dependency> 
       <groupId>com.stackoverflow</groupId> 
       <artifactId>Q11226363-scala</artifactId> 
       <version>${project.version}</version> 
      </dependency> 
      <dependency> 
       <groupId>org.scala-lang</groupId> 
       <artifactId>scala-library</artifactId> 
       <version>${scala.version}</version> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <repositories> 
     <repository> 
      <id>scala-tools.org</id> 
      <name>Scala Tools Maven2 Repository</name> 
      <url>http://scala-tools.org/repo-releases</url> 
     </repository> 
    </repositories> 
    <pluginRepositories> 
     <pluginRepository> 
      <id>scala-tools.org</id> 
      <name>Scala Tools Maven2 Repository</name> 
      <url>http://scala-tools.org/repo-releases</url> 
     </pluginRepository> 
    </pluginRepositories> 

</project> 

scala/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.stackoverflow</groupId> 
     <artifactId>Q11226363</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>Q11226363-scala</artifactId> 

    <name>${project.artifactId}-${project.version}</name> 

    <dependencies> 
     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-library</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <sourceDirectory>src/main/scala</sourceDirectory> 

     <plugins> 
      <plugin> 
       <groupId>org.scala-tools</groupId> 
       <artifactId>maven-scala-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
         <phase>compile</phase> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <goals> 
          <goal>testCompile</goal> 
         </goals> 
         <phase>test-compile</phase> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

console/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.stackoverflow</groupId> 
     <artifactId>Q11226363</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>Q11226363-console</artifactId> 

    <name>${project.artifactId}-${project.version}</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.stackoverflow</groupId> 
      <artifactId>Q11226363-scala</artifactId> 
     </dependency> 
    </dependencies> 

</project> 

web/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>com.stackoverflow</groupId> 
     <artifactId>Q11226363</artifactId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 

    <artifactId>Q11226363-web</artifactId> 
    <packaging>war</packaging> 

    <name>${project.artifactId}-${project.version}</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.stackoverflow</groupId> 
      <artifactId>Q11226363-scala</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>webapp</finalName> 

     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.2</version> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

scala/src/main/scala/com/stackoverflow/Q11226363/ScalaApp.scala

/** 
* @author maba, 2012-06-28 
*/ 
package com.stackoverflow.Q11226363 

class ScalaApp { 
    def helloScala():String = "Hello from Scala!" 
} 

console/src/main/java/com/stackoverflow/Q11226363/JavaApp.java

package com.stackoverflow.Q11226363; 

/** 
* @author maba, 2012-06-28 
*/ 
public class JavaApp { 
    public static void main(String[] args) { 
     ScalaApp scalaApp = new ScalaApp(); 
     System.out.println("Scala says: " + scalaApp.helloScala()); 
    } 
} 

che è stato testato da me. Naturalmente ci possono essere dei miglioramenti ai file pom e alle dipendenze, ma è un buon inizio.

Se si guarda nello web/target, troverete il numero webapp.war che includerà le dipendenze necessarie.

Ovviamente è possibile dividere tutti questi moduli e costruirli separatamente e avere ancora delle dipendenze tra di loro, ma come ho detto è un buon punto di partenza.

+1

Che sorprendentemente buona risposta alla domanda. Grazie! –

+0

@PeteMontgomery Bene grazie! Sono felice di poterti assistere. – maba

1

La tua soluzione C# dipende tanto da Visual Studio quanto una soluzione Java dipende dai suoi strumenti.

La risposta dipende anche dalla confezione: JAR per desktop, WAR per web, EAR per impresa con EJB.

Maven fa un sacco di scelte per voi se si decide di andare in quella direzione (ad esempio la struttura delle directory, ecc)

Eclipse e IntelliJ saranno entrambi farlo in modo diverso. IntelliJ utilizza un concetto di modulo che trovo funziona molto bene. Lo preferisco a Eclipse; Non ho familiarità con come è fatto in quell'IDE adesso.

+0

Grazie, ma in realtà non vedo alcun contenuto in questa risposta che non fosse già nella domanda ... –

2

Il mio personale approccio è quello di usare Maven per entrambi:

  • dipendenze di terzi (tipicamente tramite Maven Centrale)
  • interdipendenze tra i diversi progetti (di solito tramite la repository locale)

Funziona abbastanza bene e credo sia IDE indipendente (anche se l'ho provato solo su Eclipse)

N ota:

Se si dispone di un team che lavora insieme sugli stessi manufatti avrete bisogno di qualche modo per avere un repository condiviso che li contiene, anche se questo può essere fatto semplicemente da esempio:

+0

Ciò significa che dobbiamo eseguire il nostro server Maven? –

0

È effettivamente creare diversi progetti che saranno distribuiti ja come diversi r file; quindi, usando Maven, queste dipendenze possono essere aggiunte dove sono necessarie.

Maven porta anche l'indipendenza IDE; ci sono plug-in per IDE diversi. Ad esempio con

mvn idea:idea 

Maven crea automaticamente i file di progetto per Intellij IDE.

+0

Il 'maven-idea-plugin' è obsoleto e non dovrebbe essere usato. Basta aprire un progetto puntando al file 'pom.xml' da IntelliJ. Lo stesso per Eclipse che ora usa il plugin m2e invece di 'mvn eclipse: eclipse'. – maba

+0

Potresti fornire alcuni argomenti o riferimenti? – m3th0dman

+0

Beh, non ho downvoted di te o così volevo solo informarti che ci sono modi migliori per caricare i progetti di maven in IDE diversi. Ma per la cronaca il ['maven-idea-plugin'] (http://maven.apache.org/plugins/maven-idea-plugin/index.html) non è attivo dal 2008. Per quanto riguarda' mvn eclipse: eclipse 'ci sono informazioni [qui] (http://stackoverflow.com/questions/9227312/which-eclipse-wtp-version-should-i-use-for-maven/9227934#comment11690275_9227934) per esempio. – maba

-1

Soluzione è la proprietà di Visual Studio non .Net. In futuro, eclipse potrebbe supportare la soluzione (potrebbe essere).

È possibile emulare l'idea soluzione utilizzando il WORKSPACE concetto in Eclipse

  1. Creare una nuova area di lavoro
  2. Importa tutti i progetti (assicuratevi di controllare "Copia progetto di lavoro, in modo che una copia fisica è stato creato)
  3. Ora, ogni volta che si apre questo spazio di lavoro, si può sempre vedere tutto il progetto.

È inoltre possibile consultare altri progetti nell'area di lavoro, utilizzando Build-> Configure Build Path -> progetto e aggiungere Progetti

Se si vuole "escludere dalla soluzione", si può fare lo stesso in Eclipse "chiusura di un progetto"

+0

Come ho detto chiaramente, ho bisogno di essere indipendente dall'IDE. –

2

Utilizzando gradle, si crea un super progetto e si creano i vari moduli come sottoprogetti. Da lì, è possibile creare descrizioni dell'area di lavoro/progetto per i vari IDE.

Poiché gradle è completamente compatibile con i repository di stile Maven, anche le osservazioni di @ mikera sui repository sono valide.

+0

Funzionerebbe per, ad esempio, una libreria Scala, un'app console Java e un'app Web Java nello stesso super-progetto? –

+0

Sono abbastanza sicuro che funzionerebbe, ma non posso darti alcun dettaglio. Meglio chiedere agli esperti sui [forum] (http://forums.gradle.org/gradle). –

+0

Ho avuto un gioco con Gradle ed è bello, e certamente supporta le build multi-progetto come una cosa di prima classe. Sospetto che ci trasferiremo su di esso quando Maven diventa troppo doloroso per personalizzare! –

1

Utilizzare un progetto Maven mulit-module (pom-packaging) alla radice della struttura del progetto per creare tutte le fonti con Maven.

Quindi utilizzare workspace (Eclipse) o gruppi (NetBeans) per visualizzare il sottoinsieme di progetti con cui si desidera lavorare.

+0

Non mi interessa solo poter aprire un progetto/pacchetto alla volta.Potresti darmi maggiori informazioni su come farlo a Maven? –

+0

Ecco un tutorial: http://www.sonatype.com/books/mvnex-book/reference/multimodule.html – Puce