9

私は.NET開発者であり、新しいプロジェクトにJavaプラットフォームを使用する必要があります。

「ソリューション」は、便利なVisualStudioの概念です。Javaソリューションを同じソース管理リポジトリにビルドの相互依存関係を持つ「プロジェクト」(Javaパッケージだと思います)に分割するにはどうすればよいですか?

サードパーティの依存関係にはMavenを使用し、一部のライブラリの作成にはScalaを使用することを計画しています。

また、IDEに依存しない必要があります。

ありがたいお勧めを頂きました!

編集:ソリューションにWebアプリケーション、コンソールアプリケーション、およびScalaで記述されたライブラリが含まれると仮定します。

4

7 に答える 7

10

私はあなたが研究できる同様のモデルを設定しました。

Mavenを使用することで、可能な限りIDEに依存しなくなります。特定のIDE設定をVCSに保存する必要はなく、ソースコードとpomファイルだけを保存する必要があります。各開発者は自分のIDEを起動し、最上位のpomをポイントすると、プロジェクトがロードされます。ローカル設定が作成されますが、VCSにコミットするときは無視する必要があります。

まず第一に、マルチモジュールのMavenプロジェクトは、そのプロジェクトを使用したC#ソリューションと非常によく似たレイアウトになります。親pomを含むトップフォルダーは、構成やビルド順序などを共有するソリューションのようになります。次に、サブpomを含むサブフォルダーは、他のプロジェクト間の依存関係を持つプロジェクト定義と一致します。

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

もちろん、これらすべてのモジュールを分割して別々にビルドし、それらの間に依存関係を持たせることは可能ですが、私が言ったように、それは良い出発点です。

于 2012-06-28T08:53:18.277 に答える
2

私の個人的なアプローチは、両方にMavenを使用することです。

  • サードパーティの依存関係(通常はMaven Central経由)
  • 異なるプロジェクト間の相互依存関係(通常はローカルリポジトリ経由)

これはかなりうまく機能し、IDEに依存しないと思います(ただし、Eclipseでのみテストしました)

ノート:

同じアーティファクトで一緒に作業しているチームがある場合、それらを含む共有リポジトリを作成する方法が必要になりますが、これは次のように非常に簡単に行うことができます。

于 2012-06-27T12:41:25.160 に答える
2

gradleを使用して、1つのスーパープロジェクトを作成し、さまざまなモジュールをサブプロジェクトとして作成します。そこから、さまざまなIDEのワークスペース/プロジェクトの説明を作成できます。

gradleはMavenスタイルのリポジトリと完全に互換性があるため、リポジトリに関する@mikeraのコメントも有効です。

于 2012-06-27T12:44:41.330 に答える
1

プロジェクト構造のルートでmulit-module(pom-packaging)Mavenプロジェクトを使用して、Mavenですべてのソースをビルドします。

次に、ワークスペース(Eclipse)またはグループ(NetBeans)を使用して、操作するプロジェクトのサブセットを表示します。

于 2012-06-27T12:44:50.710 に答える
0

C#ソリューションは、Javaソリューションがそのツールに依存するのと同じようにVisualStudioに依存しています。

答えはパッケージにも依存します。デスクトップ用のJAR、Web用のWAR、EJBを使用するエンタープライズ用のEARです。

あなたがその方向に進むことにした場合、Mavenはあなたのために多くの選択をします(例えば、ディレクトリ構造など)

EclipseとIntelliJはどちらもそれを異なる方法で行います。IntelliJは、私が非常にうまく機能していると思うモジュールの概念を使用しています。私はEclipseよりもそれを好みます。私は今、そのIDEでどのように行われているのかよくわかりません。

于 2012-06-27T12:40:59.207 に答える
0

実際には、さまざまなjarファイルとしてデプロイされるさまざまなプロジェクトを作成します。次に、Mavenを使用して、これらの依存関係を必要な場所に追加できます。

MavenはIDEの独立性ももたらします。さまざまなIDE用のプラグインがあります。たとえば、

mvn idea:idea

Mavenは、IntellijIDEのプロジェクトファイルを自動的に作成します。

于 2012-06-27T12:43:33.817 に答える
-1

解決策は、.NetではなくVisualStudioのプロパティです。将来的には、Eclipseがソリューションをサポートする可能性があります(可能性があります)。

EclipseのWORKSPACEコンセプトを使用して、ソリューションのアイデアをエミュレートできます。

  1. 新しいワークスペースを作成します
  2. すべてのプロジェクトをインポートします([プロジェクトをワークスペースにコピーして、物理コピーが作成されるようにする]を必ずオンにしてください)
  3. これで、このワークスペースを開くたびに、常にすべてのプロジェクトを表示できます。

[ビルド]->[ビルドパスの構成]->[プロジェクトとプロジェクトの追加]を使用して、ワークスペース内の他のプロジェクトを参照することもできます。

「ソリューションから除外」したい場合は、「プロジェクトを閉じる」ことでEclipseでも同じことができます。

于 2012-06-27T12:44:20.490 に答える