C# 如何将Java解决方案组织到多个项目中,如在VisualStudio中?
我是一名.NET开发人员,需要在新项目中使用Java平台 “解决方案”是一个有用的VisualStudio概念。如何将Java解决方案分解为在同一源代码管理存储库中构建相互依赖关系的“项目”(我猜是Java包) 我们计划将Maven用于第三方依赖项,将Scala用于编写一些库 我们还需要独立于IDE 感谢您的推荐 编辑:假设解决方案将包含一个web应用程序、一个控制台应用程序和一个用Scala编写的库 您的C#解决方案对Visual Studio的依赖程度与Java解决方案对其工具的依赖程度一样 答案还取决于打包:JAR用于桌面,WAR用于web,EAR用于带有EJB的企业 如果您决定朝这个方向走,Maven会为您做出很多选择(例如目录结构等)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解决方案对其工具的依赖程度一样
Eclipse和IntelliJ的做法都不一样。IntelliJ使用了一个模块概念,我发现这个概念非常有效。我喜欢它胜过日食;我现在不熟悉它在该IDE中是如何实现的。我个人的做法是将Maven用于以下两个方面:
- 第三方依赖关系(通常通过Maven Central)
- 不同项目之间的相互依赖关系(通常通过本地存储库)
- 将存储库放在共享文件服务器上(请参阅:)
- 在GitHub上托管存储库(请参阅:)
mvn idea:idea
Maven会自动为Intellij IDE创建项目文件。解决方案是Visual Studio而不是.Net的属性。将来,eclipse可能支持解决方案(可能是) 您可以使用Eclipse中的工作区概念来模拟解决方案思想
然后使用工作区(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中实现这一点的信息吗?这里有一个教程:谢谢,但我在这个答案中没有看到任何问题中没有的内容。