如何将Java解决方案组织到多个项目中,例如在Visual Studio中?

Pet*_*ery 8 c# java architecture maven

我是一名.NET开发人员,他需要将Java平台用于新项目.

"解决方案"是一个有用的Visual Studio概念.如何将我的Java解决方案分解为在同一源代码控制存储库中构建相互依赖关系的"项目"(我猜Java包)?

我们计划将Maven用于第三方依赖,而Scala用于编写一些库.

我们还需要独立于IDE.

建议感激不尽!

编辑:让我们假设解决方案将包含一个Web应用程序,一个控制台应用程序和一个用Scala编写的库.

mab*_*aba 10

我已经建立了一个你可以学习的类似模型.

通过使用Maven,它将尽可能与IDE无关.您不必在VCS中存储任何特定的IDE设置,只需存储源代码和pom文件.每个开发人员都将启动他的IDE并指向顶部的pom,项目应该加载.将创建本地设置,但在提交到VCS时应忽略.

首先,一个多模块Maven项目肯定会有一个非常类似于C#解决方案及其项目的布局.带有父pom的顶级文件夹将类似于具有共享配置和构建顺序等的解决方案.然后,具有子poms的子文件夹将使项目定义与其他项目之间的依赖项匹配.

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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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!"
}
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这已经过我的测试.当然可以对pom文件和依赖项进行一些改进,但这是一个好的开始.

如果您查看,web/target您将找到webapp.war包含所需依赖项的内容.

当然可以将所有这些模块分开并单独构建它们并且仍然具有它们之间的依赖关系,但正如我所说它是一个很好的起点.