C# 如何将Java解决方案组织到多个项目中,如在VisualStudio中?

C# 如何将Java解决方案组织到多个项目中,如在VisualStudio中?,c#,java,maven,architecture,C#,Java,Maven,Architecture,我是一名.NET开发人员,需要在新项目中使用Java平台 “解决方案”是一个有用的VisualStudio概念。如何将Java解决方案分解为在同一源代码管理存储库中构建相互依赖关系的“项目”(我猜是Java包) 我们计划将Maven用于第三方依赖项,将Scala用于编写一些库 我们还需要独立于IDE 感谢您的推荐 编辑:假设解决方案将包含一个web应用程序、一个控制台应用程序和一个用Scala编写的库 您的C#解决方案对Visual Studio的依赖程度与Java解决方案对其工具的依赖程度一样

我是一名.NET开发人员,需要在新项目中使用Java平台

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

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

我们还需要独立于IDE

感谢您的推荐

编辑:假设解决方案将包含一个web应用程序、一个控制台应用程序和一个用Scala编写的库

您的C#解决方案对Visual Studio的依赖程度与Java解决方案对其工具的依赖程度一样

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

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


Eclipse和IntelliJ的做法都不一样。IntelliJ使用了一个模块概念,我发现这个概念非常有效。我喜欢它胜过日食;我现在不熟悉它在该IDE中是如何实现的。

我个人的做法是将Maven用于以下两个方面:

  • 第三方依赖关系(通常通过Maven Central)
  • 不同项目之间的相互依赖关系(通常通过本地存储库)
这工作得很好,我相信它是独立于IDE的(尽管我只在Eclipse上测试过它)

注意:

如果您有一个团队一起处理相同的工件,您将需要某种方式来拥有一个包含这些工件的共享存储库,尽管这可以非常简单地通过以下方式实现:

  • 将存储库放在共享文件服务器上(请参阅:)
  • 在GitHub上托管存储库(请参阅:)

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

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

mvn idea:idea

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

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

您可以使用Eclipse中的工作区概念来模拟解决方案思想

  • 创建一个新的工作区
  • 导入所有项目(确保选中“将项目复制到工作区,以便创建物理副本”)
  • 现在,无论何时打开此工作区,都可以看到所有项目
  • 您还可以使用Build->Configure Build Path->Project和Add projects引用工作区中的其他项目

    如果您想“从解决方案中排除”,您可以在eclipse中通过使用“关闭项目”来执行相同的操作,您可以创建一个超级项目,并将各种模块创建为子项目。 从那里,您可以为各种IDE创建工作区/项目描述

    由于gradle与Maven风格的存储库完全兼容,@mikera关于存储库的评论也是有效的。

    在项目结构的根目录下使用多模块(pom打包)Maven项目来使用Maven构建所有源代码


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

    我已经建立了一个类似的模型,您可以研究它

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

    首先,多模块Maven项目的布局肯定与C#解决方案及其项目非常相似。具有父pom的顶部文件夹将与具有共享配置和构建顺序等的解决方案类似。然后,具有子pom的子文件夹将匹配具有其他p之间依赖关系的项目定义火箭

    目录布局

    +- 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>
    
    <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>
    
    <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>
    
    <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>
    
    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>
    
        <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>
    
    <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>
    
    <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>
    
    <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/q1126363/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
    ,其中将包含所需的依赖项


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

    这是否适用于同一超级项目中的Scala库、Java控制台应用程序和Java web应用程序?我非常肯定它会起作用,但我无法提供任何详细信息。最好我和Gradle玩过一个游戏,它很可爱,而且它肯定支持多项目构建,这是一流的东西。我怀疑当Maven变得太难定制时,我们会转向它!如果你有选择的话,我强烈建议立即从Gradle开始。痛苦的经验告诉我们,没有一个好的点不需要转换整个构建系统,只添加另一个变通方法总是有点不那么痛苦。谢谢,我通常会同意。不过,在这种情况下,我们大多数人对整个Java平台都是新手,但团队中至少对Maven有一点熟悉!这是否意味着我们必须运行自己的Maven服务器?我不介意这样做o一次打开一个项目/包。你能给我更多关于如何在Maven中实现这一点的信息吗?这里有一个教程:谢谢,但我在这个答案中没有看到任何问题中没有的内容。