2012-06-27 13 views
7

Soy un desarrollador .NET que necesita usar la plataforma Java para un nuevo proyecto.¿Cómo se organiza una solución Java en múltiples proyectos, como en Visual Studio?

Las "Soluciones" son un concepto útil de Visual Studio. ¿Cómo puedo dividir mi solución Java en "proyectos" (supongo que paquetes Java) que tienen interdependencias de compilación en el mismo repositorio de control de origen?

Estamos planeando usar Maven para dependencias de terceros y Scala para escribir algunas de las bibliotecas.

También necesitamos ser independientes de IDE.

Recomendaciones recibidas con gratitud!

Editar: Supongamos que la solución contendrá una aplicación web, una aplicación de consola y una biblioteca escrita en Scala.

Respuesta

9

He creado un modelo similar que puedes estudiar.

Al usar Maven será tan IDE-agnóstico como sea posible. No tendrá que almacenar ninguna configuración IDE específica en su VCS, solo el código fuente y los archivos pom. Cada desarrollador lanzará su IDE y señalará el pom superior y el proyecto debería cargarse. Se crearán configuraciones locales, pero se deben ignorar al comprometerse con el VCS.

En primer lugar, un proyecto de varios módulos Maven definitivamente tendrá un diseño muy similar a una solución C# con sus proyectos. La carpeta superior con el parent-pom será como la solución con las configuraciones compartidas y el orden de compilación, etc. Luego, las subcarpetas con los subpoms coincidirán con las definiciones del proyecto con las dependencias entre otros proyectos.

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

que ha sido probado por mí. Por supuesto, puede haber algunas mejoras en los archivos pom y las dependencias, pero es un buen comienzo.

Si mira en el web/target, encontrará su webapp.war que incluirá las dependencias necesarias.

Por supuesto, es posible dividir todos estos módulos y construirlos por separado y aún tener dependencias entre ellos, pero como dije, es un buen punto de partida.

+1

¡Qué asombrosamente buena respuesta a la pregunta! ¡Gracias! –

+0

@PeteMontgomery ¡Bien, gracias! Me alegro de poder ayudarte. – maba

1

Su solución C# es tan dependiente de Visual Studio como una solución Java que dependerá de sus herramientas.

La respuesta también depende del embalaje: JAR para escritorio, WAR para web, EAR para enterprise con EJB.

Maven hace un montón de opciones para usted si usted decide ir en esa dirección (por ejemplo, la estructura de directorios, etc.)

Eclipse y IntelliJ será tanto hacerlo de manera diferente. IntelliJ usa un concepto de módulo que me parece que funciona muy bien. Lo prefiero sobre Eclipse; No estoy familiarizado con cómo se hace en ese IDE ahora.

+0

Gracias, pero realmente no veo ningún contenido en esta respuesta que no estuviera ya en la pregunta ... –

2

Mi enfoque personal es utilizar Maven para ambos:

  • dependencias de terceros (normalmente a través de Maven central)
  • interdependencias entre los distintos proyectos (normalmente a través del repositorio local)

Esto funciona bastante bien y creo que es IDE independiente (aunque solo lo he probado en Eclipse)

N ota:

Si usted tiene un equipo trabajando juntos en los mismos artefactos que necesitará un poco de manera de tener un repositorio compartido que los contienen, aunque esto se puede hacer simplemente por ejemplo:

+0

¿Esto significa que debemos ejecutar nuestro propio servidor Maven? –

0

crear realmente diferentes proyectos que se implementarán como diferentes ja r archivos; luego, usando Maven, estas dependencias se pueden agregar donde se necesiten.

Maven también aporta independencia IDE; hay complementos para diferentes IDEs. Por ejemplo, con

mvn idea:idea 

Maven crea automáticamente los archivos de proyecto para IntelliJ IDE.

+0

El 'maven-idea-plugin' es obsoleto y no debe usarse. Simplemente abra un proyecto señalando el archivo 'pom.xml' desde IntelliJ. Lo mismo para Eclipse, que ahora usa el plugin m2e en lugar de 'mvn eclipse: eclipse'. – maba

+0

¿Podría proporcionar algunos argumentos o referencias? – m3th0dman

+0

Bueno, no te he votado negativamente o solo quería informarte que hay mejores maneras de cargar proyectos maven en diferentes IDEs. Pero para el registro, el ['maven-idea-plugin'] (http://maven.apache.org/plugins/maven-idea-plugin/index.html) no ha estado activo desde 2008. Con respecto a' mvn eclipse: eclipse 'hay información [aquí] (http://stackoverflow.com/questions/9227312/which-eclipse-wtp-version-should-i-use-for-maven/9227934#comment11690275_9227934) por ejemplo. – maba

-1

La solución es propiedad de Visual Studio no .Net. En el futuro, eclipse podría ser una solución (puede ser).

Puede emular la idea de soluciones utilizando la concepto espacio de trabajo en Eclipse

  1. Crear un nuevo espacio de trabajo
  2. Importar todos los proyectos (asegúrese de comprobar "Copiar proyecto al espacio de trabajo, por lo que una copia física se crea)
  3. Ahora, cada vez que abre este espacio de trabajo, siempre se puede ver todo el proyecto.

también puede referir a otros proyectos en el área de trabajo, usando Generar-> Configurar Vía de construcción -> proyecto y agregar Proyectos

Si desea "Excluir de la solución", se puede hacer lo mismo en Eclipse de "cerrar un proyecto"

+0

Como dije claramente, necesito ser independiente de IDE. –

2

Usando gradle, crearía un superproyecto y crearía sus diversos módulos como subproyectos. Desde allí, puede crear descripciones de espacio de trabajo/proyecto para los diversos IDEs.

Dado que gradle es totalmente compatible con los repositorios de estilo Maven, las observaciones de @ mikera en los repositorios también son válidas.

+0

¿Esto funcionaría para, digamos, una biblioteca Scala, una aplicación de consola Java y una aplicación web Java en el mismo superproyecto? –

+0

Estoy bastante seguro de que funcionaría, pero no puedo darle ningún detalle. Lo mejor es preguntar a los expertos en los [foros] (http://forums.gradle.org/gradle). –

+0

Tuve un juego con Gradle y es encantador, y sin duda es compatible con las compilaciones de proyectos múltiples como algo de primera clase. ¡Sospecho que nos moveremos cuando Maven se convierta en un gran problema para personalizar! –

1

Utilice un módulo mulit (pom-packaging) Maven en la raíz de la estructura de su proyecto para construir todas las fuentes con Maven.

Luego use espacios de trabajo (Eclipse) o grupos (NetBeans) para visualizar el subconjunto de proyectos con los que desea trabajar.

+0

No me importa solo poder abrir un proyecto/paquete a la vez.¿Podrían darme más información sobre cómo hacer esto en Maven? –

+0

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

Cuestiones relacionadas