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

时间:2012-06-27 12:36:09

标签: c# java maven architecture

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

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

我们计划将Maven用于第三方依赖项,并使用Scala编写一些库。

我们还需要独立于IDE。

建议感激不尽!

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

7 个答案:

答案 0 :(得分: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

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

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

如果你查看web/target,你会发现你的webapp.war将包含所需的依赖项。

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

答案 1 :(得分:2)

我个人的方法是使用Maven:

  • 第三方依赖关系(通常通过Maven Central)
  • 不同项目之间的相互依赖关系(通常通过本地存储库)

这非常有效,我相信它与IDE无关(虽然我只在Eclipse上测试过它)

注意:

如果你有一个团队在同一个工件上工作,你需要一些方法来拥有一个包含它们的共享存储库,尽管这可以通过简单的方式完成:

答案 2 :(得分:2)

使用gradle,您将创建一个超级项目并创建各种模块作为子项目。 从那里,您可以为各种IDE创建工作区/项目描述。

由于gradle与Maven样式存储库完全兼容,因此@ mikera对存储库的评论也是有效的。

答案 3 :(得分:1)

您的C#解决方案依赖于Visual Studio,因为Java解决方案将依赖于其工具。

答案还取决于打包:桌面的JAR,Web的WAR,带EJB的企业的EAR。

如果您决定朝这个方向前进(例如目录结构等),Maven会为您做出很多选择。

Eclipse和IntelliJ都会采用不同的方式。 IntelliJ使用我发现非常好的模块概念。我比Eclipse更喜欢它;我现在不熟悉它在IDE中是如何完成的。

答案 4 :(得分:1)

在项目结构的根目录中使用mulit-module(pom-packaging)Maven项目,使用Maven构建所有源代码。

然后使用工作区(Eclipse)或组(NetBeans)显示您要使用的项目子集。

答案 5 :(得分:0)

您实际上创建了不同的项目,这些项目将被部署为不同的jar文件;然后,使用Maven,可以在需要的地方添加这些依赖项。

Maven也带来了IDE的独立性;有不同IDE的插件。例如

mvn idea:idea

Maven自动为Intellij IDE创建项目文件。

答案 6 :(得分:-1)

解决方案是Visual Studio的属性,而不是.Net。将来,eclipse可能支持解决方案(可能)。

您可以使用Eclipse中的 WORKSPACE 概念来模拟解决方案的想法

  1. 创建新工作区
  2. 导入所有项目(确保选中“将项目复制到工作区,以便创建物理副本”)
  3. 现在,无论何时打开此工作区,您都可以随时查看所有项目。
  4. 您还可以使用Build-&gt; Configure Build Path - &gt;来引用工作区中的其他项目。项目和添加项目

    如果你想“从解决方案中排除”,你可以通过“关闭项目”在日食中做同样的事情