簡體   English   中英

如何將Java解決方案組織到多個項目中,例如在Visual Studio中?

[英]How do you organise a Java solution into multiple projects, like in Visual Studio?

我是一名.NET開發人員,他需要將Java平台用於新項目。

“解決方案”是一個有用的Visual Studio概念。 如何將我的Java解決方案分解為在相同源代碼控制存儲庫中構建相互依賴關系的“項目”(我猜Java包)?

我們計划將Maven用於第三方依賴,而Scala用於編寫一些庫。

我們還需要獨立於IDE。

建議感激不盡!

編輯:讓我們假設解決方案將包含一個Web應用程序,一個控制台應用程序和一個用Scala編寫的庫。

我已經建立了一個你可以學習的類似模型。

通過使用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將包含所需的依賴項。

當然可以將所有這些模塊分開並單獨構建它們並且仍然具有它們之間的依賴關系,但正如我所說它是一個很好的起點。

我個人的方法是使用Maven:

  • 第三方依賴(通常通過Maven Central)
  • 不同項目之間的相互依賴關系(通常通過本地存儲庫)

這很好用,我相信它獨立於IDE(雖然我只在Eclipse上測試過它)

注意:

如果你有一個團隊在同一個工件上一起工作,你需要一些方法來擁有一個包含它們的共享存儲庫,盡管這可以通過例如:

使用gradle ,您將創建一個超級項目並創建各種模塊作為子項目。 從那里,您可以為各種IDE創建工作區/項目描述。

由於gradle與Maven樣式存儲庫完全兼容,因此@ mikera對存儲庫的評論也是有效的。

您的C#解決方案依賴於Visual Studio,因為Java解決方案將依賴於其工具。

答案還取決於打包:JAR for desktop,WAR for web,EAR for enterprise with EJBs。

如果您決定朝這個方向前進(例如目錄結構等),Maven會為您做出很多選擇

Eclipse和IntelliJ都會采用不同的方式。 IntelliJ使用我發現非常好的模塊概念。 我比Eclipse更喜歡它; 我現在不熟悉它在IDE中是如何完成的。

在項目結構的根目錄下使用多個模塊(pom-packaging)Maven項目,使用Maven構建所有源代碼。

然后使用工作空間(Eclipse)或組(NetBeans)顯示要使用的項目子集。

您實際創建了不同的項目,這些項目將被部署為不同的jar文件; 然后,使用Maven,可以在需要的地方添加這些依賴項。

Maven還帶來IDE獨立性; 有不同IDE的插件。 例如用

mvn idea:idea

Maven自動為Intellij IDE創建項目文件。

解決方案是Visual Studio的屬性而不是.Net。 將來,eclipse可能支持解決方案(可能)。

您可以使用Eclipse中的WORKSPACE概念來模擬解決方案的想法

  1. 創建一個新工作區
  2. 導入所有項目(確保選中“將項目復制到工作區,以便創建物理副本”)
  3. 現在,無論何時打開此工作區,您始終可以看到所有項目。

您還可以使用構建 - >配置構建路徑 - >項目和添加項目來引用工作區中的其他項目

如果你想“從解決方案中排除”,你可以通過“關閉項目”在eclipse中做同樣的事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM