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.