9 votes

Comment organiser une solution Java en plusieurs projets, comme dans Visual Studio ?

Je suis un développeur .NET qui doit utiliser la plate-forme Java pour un nouveau projet.

Les "solutions" sont un concept utile de Visual Studio. Comment puis-je diviser ma solution Java en "projets" (je suppose des paquets Java) qui ont des interdépendances de construction dans le même référentiel de contrôle des sources ?

Nous prévoyons d'utiliser Maven pour les dépendances tierces, et Scala pour l'écriture de certaines bibliothèques.

Nous devons également être indépendants de l'IDE.

Nous vous remercions de vos recommandations !

Edit : Supposons que la solution contienne une application web, une application console, et une bibliothèque écrite en Scala.

11voto

maba Points 15744

J'ai mis en place un modèle similaire que vous pouvez étudier.

En utilisant Maven, il sera aussi agnostique que possible par rapport aux IDE. Vous n'aurez pas à stocker de paramètres d'IDE spécifiques dans votre VCS, seulement le code source et les fichiers pom. Chaque développeur lancera son IDE et pointera vers le pom supérieur et le projet devrait se charger. Des paramètres locaux seront créés, mais ils devront être ignorés lors de l'enregistrement dans le VCS.

Tout d'abord, un projet Maven multi-modules aura certainement une disposition très similaire à celle d'une solution C# avec ses projets. Le dossier supérieur avec le pom-parent sera comme la solution avec les configurations partagées et l'ordre de construction, etc. Ensuite, les sous-dossiers avec les sous-poms correspondront aux définitions de projet avec les dépendances entre les autres projets.

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());
    }
}

Cela a été testé par moi. Il peut bien sûr y avoir quelques améliorations au niveau des fichiers pom et des dépendances mais c'est un bon début.

Si vous regardez dans le web/target vous trouverez votre webapp.war qui inclura les dépendances nécessaires.

Il est bien sûr possible de diviser tous ces modules et de les construire séparément tout en conservant des dépendances entre eux, mais comme je l'ai dit, c'est un bon point de départ.

2voto

mikera Points 63056

Mon approche personnelle consiste à utiliser Maven pour les deux :

  • Dépendances de tiers (généralement via Maven Central)
  • Interdépendances entre différents projets (généralement via le référentiel local)

Cela fonctionne assez bien et je crois que c'est indépendant de l'IDE (bien que je ne l'aie testé que sur Eclipse).

Note :

Si vous avez une équipe travaillant ensemble sur les mêmes artefacts, vous aurez besoin d'un moyen d'avoir un dépôt partagé les contenant, bien que cela puisse être fait assez simplement par exemple :

2voto

Urs Reupke Points 2987

Utilisation de gradle Pour cela, vous devez créer un super-projet et créer vos différents modules en tant que sous-projets. À partir de là, vous pouvez créer des descriptions d'espace de travail/de projet pour les différents IDE.

Puisque gradle est entièrement compatible avec les dépôts de style Maven, les remarques de @mikera sur les dépôts sont également valables.

1voto

Puce Points 13540

Utilisez un projet Maven mulit-module (pom-packaging) à la racine de votre structure de projet pour construire toutes les sources avec Maven.

Utilisez ensuite les espaces de travail (Eclipse) ou les groupes (NetBeans) pour afficher le sous-ensemble de projets sur lequel vous souhaitez travailler.

0voto

duffymo Points 188155

Votre solution C# est aussi dépendante de Visual Studio qu'une solution Java sera dépendante de ses outils.

La réponse dépend également de l'emballage : JAR pour le bureau, WAR pour le web, EAR pour l'entreprise avec EJBs.

Maven fait beaucoup de choix pour vous si vous décidez d'aller dans cette direction (par exemple, la structure des répertoires, etc.).

Eclipse et IntelliJ le feront tous deux différemment. IntelliJ utilise un concept de module qui, selon moi, fonctionne très bien. Je le préfère à Eclipse ; je ne suis pas familier avec la façon dont il est fait dans cet IDE maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X