如何模块化(大型)Java 应用程序?

2024-04-20

我手头有一个相当大的(几个 MLOC)应用程序,我想将其拆分为更易于维护的单独部分。目前该产品由大约 40 个 Eclipse 项目组成,其中许多项目具有相互依赖性。仅此一点就使得连续构建系统变得不可行,因为每次签入都必须进行大量重建。

有没有一种“最佳实践”方法

  • 识别可以立即分离的部分
  • 直观地记录相互依赖关系
  • 理清现有代码
  • 处理我们需要应用于库的“补丁”(当前通过将它们放在实际库之前的类路径中来处理)

如果有(免费/开放)工具支持这一点,我将不胜感激。

尽管我没有任何使用 Maven 的经验,但它似乎强制采用了非常模块化的设计。我现在想知道这是否可以迭代地进行改造,或者使用它的项目是否必须从一开始就考虑到模块化的布局。

编辑2009-07-10

我们正在使用以下方法拆分一些核心模块:阿帕奇蚂蚁/常春藤 http://ant.apache.org/ivy。真正有用且设计良好的工具,不像 Maven 那样强加给你那么多。

我在我的博客上写下了一些关于我们为什么这样做的更一般的细节和个人观点 - 太长了,无法在这里发布,而且可能不是每个人都感兴趣,所以请自行决定遵循:www.danielschneller.com http://www.danielschneller.com/2009/07/modularizing-software-with-antivy-and.html


Using OSGi http://www.osgi.org/Main/HomePage可能很适合你。它将允许在应用程序之外创建模块。您还可以以更好的方式组织依赖关系。如果您正确定义了不同模块之间的接口,那么您可以使用持续集成,因为您只需重建在签入时受影响的模块。

OSGi 提供的机制将帮助您理清现有代码。由于类加载的工作方式,它还可以帮助您以更简单的方式处理补丁。

OSGi 的一些概念似乎很适合您,如维基百科所示: http://en.wikipedia.org/wiki/OSGi

该框架在概念上分为以下几个区域:

  • 捆绑包 - 捆绑包是带有额外清单标头的普通 jar 组件。
  • 服务 - 服务层通过为普通旧 Java 对象 (POJO) 提供发布-查找-绑定模型,以动态方式连接捆绑包。
  • 服务注册中心 - 用于管理服务的 API(ServiceRegistration、ServiceTracker 和 ServiceReference)。
  • 生命周期 - 用于生命周期管理(安装、启动、停止、更新和卸载捆绑包)的 API。
  • 模块 - 定义封装和依赖关系声明的层(包如何导入和导出代码)。
  • 安全性 - 通过将捆绑包功能限制为预定义功能来处理安全方面的层。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模块化(大型)Java 应用程序? 的相关文章

  • 使用 Intellij Idea 和 gradle 在应用程序引擎上调试 localhost

    我正在使用 IntelliJ 社区添加并使用 Gradle 构建应用程序引擎标准环境应用程序 在迁移到 IntelliJ 和端点框架之前 我使用的是 Android Studio 我无法调试我的本地主机 我添加了 jvmFlags 如下所述
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • 我应该使用“| at now”还是与号(&)在后台运行脚本?

    我一直在查看有关在后台运行 php 脚本的答案 它们似乎以两种方式传播 有些人建议使用这个 或类似的东西 usr bin php command gt dev null 2 gt 1 其他建议使用 at 命令 echo usr bin ph
  • 使用 github 操作缓存 npm 依赖项

    我想缓存 npm 依赖项 这样我就不会每次推送时都执行 npm install 而是从缓存加载它 我认为 github action 现在支持这个了吗 如何缓存 GitHub 操作中的步骤 https stackoverflow com q
  • 如果阈值不够好,如何检测 opencv (c++) 中的异常?

    我有这样的灰度图像 I want to detect anomalies on this kind of images On the first image upper left I want to detect three dots on
  • ASP.NET MVC 3 OnActionExecuting 导致无限循环

    我有重写的 OnActionExecuting 方法 如果用户登录 则在操作执行之前检查 public class AuthenticationAttribute ActionFilterAttribute public override
  • 在设计时获取文件的相对路径

    我正在构建一个 Windows Phone 8 应用程序 在设计时 我加载示例 XML 文件来获取示例数据 它运行良好 但我想使用相对于解决方案根目录的文件路径 以便它可以适用于具有相同代码的所有开发人员 这是我当前的代码 var path
  • 是否可以在 Golang 中创建类型通用(模板)函数

    我是新手 只是玩玩它 但我已经编写了一个命令行工具 我调用了大约 30 个不同的函数return x err 在每种情况下 如果出现错误 我想做的只是恐慌 基本上一切都完美运行 或者整个事情都失败了 我知道有template Must t
  • 底部渐变边框

    根据CSS 技巧 http css tricks com examples GradientBorder 以下 CSS 语法将导致左边框渐变 left to right border width 3px 0 3px 3px webkit b
  • “gcloud deploy”抱怨同时拥有 .gcloudignore 和skip_files,尽管我两者都没有

    我正在尝试将 Django v2 1 应用程序部署到 App Engines Python37 运行时 这是我的app yaml这是取自谷歌示例 https github com GoogleCloudPlatform python doc
  • 自定义 Applescript 应用程序图标

    我已经创建了我的苹果脚本 https en wikipedia org wiki AppleScript 对其进行了测试 将其另存为 app 并且可以正常工作 现在 如何为其设置自定义图标 我做了一些谷歌搜索并尝试了一些不同的事情 但无法让
  • ionic-Angular Components.core.scss 错误

    刚从 Ionic 2 开始 我的第一个应用程序失败并出现错误 错误 导入指令不能在控制指令或混合中使用 在node modules ionic angular components core scss的第34行 import 字体 离子图标
  • 如何从数据库获取连接字符串

    我已经使用 SQL Server Management Studio 创建了一个数据库 现在我想在我的 C 应用程序中使用它 我需要连接字符串吗 我在哪里可以找到连接字符串 我的数据库存储在哪里 我是否必须发布它或类似的东西 或者它在我的文
  • PHP __halt_compiler 未找到

    我正在使用 PHP 5 6 运行本地服务器 我正在使用使用该函数的第三方库 halt compiler 一旦达到此功能 我会收到以下错误 PHP 致命错误 未捕获异常 UnexpectedValueException 消息 phar 内部损
  • 从 URL 解析域

    我需要构建一个从 URL 解析域的函数 So with http google com dhasjkdas sadsdds sdda sdads html or http www google com dhasjkdas sadsdds s
  • 在打字稿中扩展角度全局对象

    我正在使用 Angularjs 和 Typescript 我想使用如下自定义函数来扩展 Angular 对象 angular executeAfterDigest function 我该如何去做这件事呢 我怀疑我需要以某种方式扩展 IAng
  • Omnipay 如何添加新网关

    有谁知道如何向 Omnipay 添加新的支付网关 我读了博客https groups google com forum topic omnipay j7OeQQSB95A https groups google com forum topi
  • Xcode 找不到 cstddef

    由于某种原因 Xcode iOS 无法找到我正在使用的库 Boost 的 cstddef 有谁知道如何解决这一问题 我正在 Mac OS X 10 8 下使用 Xcode 4 6 进行编译 你应该让你的项目全部为 Objective C 将
  • 如何处理Android应用程序中标记的双击

    我在地图上显示车辆 当我单击车辆时 它会显示信息窗口 但我需要双击车辆 然后它会转到新页面 我不知道该怎么做 请帮助我 这是我的代码 public class MapsActivity extends FragmentActivity im
  • 如何将其制作为左/右滑动 div

    下面提供的是我的 html 和 css 代码的片段 我不仅需要在 html 和 css 中添加 而且还需要在 javascript 中添加什么 才能使其以滑入 滑出的方式工作 向右打开 和 左关闭 div div a href Edit P
  • 创建后缀号码球拍

    我正在尝试在 Racket 中试验我可以做的事情 并且我想在数字后加上字母 对于这个例子 我只想代表10000 as 10K and 1000000 as 1M 有没有办法 用宏或其他方式 我可以扩展1M to 1 1000000 或者有什
  • 如何模块化(大型)Java 应用程序?

    我手头有一个相当大的 几个 MLOC 应用程序 我想将其拆分为更易于维护的单独部分 目前该产品由大约 40 个 Eclipse 项目组成 其中许多项目具有相互依赖性 仅此一点就使得连续构建系统变得不可行 因为每次签入都必须进行大量重建 有没