【发布时间】:2012-12-29 11:35:45
【问题描述】:
我要开发一个Java系统,它由三个应用程序组成。这个应用程序使用相同的包。例如,如何在 IntelliJ IDEA 中组织这个项目?它必须在项目中以包的一个层次结构或在库中使用的不同项目中组织的所有源。你能告诉我专业的解决方案吗?
【问题讨论】:
标签: java intellij-idea project-organization
我要开发一个Java系统,它由三个应用程序组成。这个应用程序使用相同的包。例如,如何在 IntelliJ IDEA 中组织这个项目?它必须在项目中以包的一个层次结构或在库中使用的不同项目中组织的所有源。你能告诉我专业的解决方案吗?
【问题讨论】:
标签: java intellij-idea project-organization
我使用以下方法:root-project 由一些子项目组成。其中一些依赖于其他(在项目属性中配置)来使用项目依赖的代码库。
root-project
+---- project1
+---- project2
+---- project3
+---- shared-code-project
【讨论】:
如果真的很专业,假设您还需要使用 Maven 和布局文件夹沿 Maven concepts 构建您的项目。即使您永远不会从命令行构建,最近大多数优秀的 IDE 也应该支持 Maven 项目。以后很有可能需要用到 Maven,迁移的工作量会更少。
更新:这是在撰写本文时。现在我建议使用gradle,它在某种程度上比 Maven 更受欢迎。
【讨论】:
专业的解决方案是不要依赖 IDE 来构建您的软件。您想使用构建工具来构建软件。有许多构建工具可供选择,例如
等等
您选择的工具取决于您对构建软件的看法。
例如 Make、ANT 等工具采用“照我说的做”的方法来构建软件。如果您喜欢明确说明您想要做什么以及如何完成,这可能会很好。
Maven 等工具采用“约定优于配置”的方法。他们说如果你遵循约定,你不应该重复告诉构建工具如何做标准的事情,例如,如果你把你的 Java 源代码放在src/main/java 目录中,那么 Maven 会自动编译它对您而言,如果您将测试源代码放在src/test/java 中,那么 Maven 将为您编译并运行所有测试。
Maven 并不适合所有人...有些人似乎想花更多的时间告诉构建工具确切要做什么,而花更少的时间编写他们的软件...这很好...不是我(我是在 Maven PMC 上......猜我最喜欢的构建工具是什么并不奇怪)......但是这些人确实喜欢 Maven 提供的一些“约定优于配置”的东西......他们只是想要一种更灵活的覆盖方式当他们需要摆脱常规时......具有这种心态的人会使用 Gradle 和 Buildr 等工具。
好的 IDE 会获取构建文件并从该构建工具推断项目结构。 IntelliJ、Eclipse 和 NetBeans 都理解 Maven 的 pom.xml 构建文件。它使您的 IDE 设置为无操作。由于我个人使用 Maven 和 IntelliJ,因此我没有调查其他构建工具在 IDE 中的公平性。
选择一个构建工具,看看它是如何为您工作的。我假设您使用的是版本控制系统...如果您要更改构建工具应该没什么大不了的。
如果您选择使用 Maven,您将从 4 或 5 模块项目开始(一个父模块和三个子模块,可能还有一个共享的公共模块)
代码结构如下
+- pom.xml (the root parent pom)
+- common (the common module directory)
| +- pom.xml (the common module pom)
| \- src
| +- main
| | +- java
| | | \- com... (your package dirs for common classes)
| | \- resources
| | \- com... (your package dirs for common classpath resources)
| \- test
| +- java
| | \- com... (your package dirs for tests of common classes)
| \- resources
| \- com... (your package dirs for common test classpath resources)
+- app1 (the app1 module directory)
| +- pom.xml (the app1 module pom)
| \- src
| +- main
| | +- java
| | | \- com...
| | \- resources
| | \- com...
| \- test
| +- java
| | \- com...
| \- resources
| \- com...
+- app2 (the app2 module directory)
| +- pom.xml (the app2 module pom)
| \- src
| +- main
| | +- java
| | | \- com...
| | \- resources
| | \- com...
| \- test
| +- java
| | \- com...
| \- resources
| \- com...
\- app3 (the app3 module directory)
+- pom.xml (the app3 module pom)
\- src
+- main
| +- java
| | \- com...
| \- resources
| \- com...
\- test
+- java
| \- com...
\- resources
\- com...
你的根 pom.xml 看起来像
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mydomain.something</groupId>
<artifactId>something-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>app1</module>
<module>app2</module>
<module>app3</module>
</modules>
</project>
common/pom.xml 看起来像
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mydomain.something</groupId>
<artifactId>something-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>something-common</artifactId>
<dependencies>
<!-- insert the 3rd party dependencies you want -->
</dependencies>
</project>
然后每个应用程序 pom 将看起来像这样
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mydomain.something</groupId>
<artifactId>something-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>something-app1</artifactId>
<dependencies>
<dependency>
<groupId>com.mydomain.something</groupId>
<artifactId>something-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- insert any 3rd party dependencies you want for app1 only -->
</dependencies>
</project>
希望对你有帮助
【讨论】: