有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在企业Java/中。Net项目,每个开发人员的类路径中是否都有所有依赖项?

关于大规模Java/。Net企业项目中,每个开发人员是否需要在其类路径/本地开发环境中拥有所有组件/库/依赖项,以便进行构建

或者它们被划分成更小的部分,可以独立构建(这样它们就不需要引用所有依赖项)


换句话说:如果他们想运行整个应用程序,他们需要所有的组件;但如果他们只运行应用程序的一个子集,他们只需要相应的组件子集

大型企业项目通常采用第一种方式还是第二种方式组织


如果您正在处理整个项目中自包含但被其他模块引用的模块(换句话说,依赖关系树中的叶节点),则可能是一个组织

另一个组织是,如果动态加载所使用的类,则可以在类路径中不包含任何类的情况下进行构建。要运行它,您的类路径只需要访问您实际加载的类(可能还有许多其他类构成了项目的不同部分,而您没有加载)

这些都是理论上的可能性;但是,企业项目的标准实践是什么呢。。。实际上呢


我已将此扩展到包括。Net,因为我认为同样的问题也会出现(DLL地狱?)


共 (6) 个答案

  1. # 1 楼答案

    一个好的项目结构将分解一些东西,这样您就可以运行独立的模块

    但在现实生活中,我所见过的大多数项目都是在有人厌倦了并主动打破它们之后才会这样做的

    如果您正确地使用了良好的依赖关系管理基础设施(如Maven或Ivy),则可以将编译后的模块存储在服务器上,并根据需要下载这些依赖关系

    您还可以使用许多模拟对象和服务来帮助分解对其他产品组件的测试依赖关系

  2. # 2 楼答案

    在我看来,不是开发人员是否可以处理应用程序的子集,而是管理组成应用程序的项目(比如Eclipse项目)之间的依赖关系。通常,您可能有一个这样的项目树,其中一个或多个项目可以依赖于其他项目。在这种情况下,上游/普通项目的角色通常是确保下游项目不会因该上游项目的变更而中断

    这样想吧-假设您有一个utils项目,其中为您的应用程序放置了所有公共/实用程序功能-这可能是验证逻辑、字符串实用程序、日志记录等。您还有一堆其他项目使用这个utils中的类

        utils
       /     \
    proja   projb
    

    在这种情况下,从事^{工作的人也应该在他们的开发环境上拥有^{和^{},因为对utils的任何更改都会破坏他们。但是,如果您只处理projb,那么您可能不需要包含proja,因为您对该项目没有依赖关系

  3. # 3 楼答案

    他们可能只需要一个子集来构建,另一个子集来运行他们的测试,但由于规模较小的Java项目的所有依赖关系都可能很快成为需要跟踪的噩梦,Java开发人员已经爱上了他们精心构建的系统,如Maven,为他们管理开发环境

    对于不使用此类系统的项目,通常最简单的方法是始终包含所有内容。取舍是不必要的臃肿的开发环境,而不是必须花费时间来跟踪缺少的依赖项

  4. # 4 楼答案

    我当然同意这样的评论,即把事情分开是“好的”。但实际上,这是非常罕见的

    假设您必须在一个没有分离的环境中工作,那么还有另一种组织策略,这就是我所看到的。因为您的问题同时涉及构建和运行依赖关系,所以您似乎不是在谈论流程,而是在谈论类和JAR

    简单的解决方案是在一个共享服务器上建立一套完整的、经过集成测试(或集成测试就绪)的依赖关系

    然后,开发人员在本地环境中构建他们正在工作的系统部分,使用一个类路径,该类路径首先引用他们的开发,然后引用适当的共享服务器

  5. # 5 楼答案

    您的问题不是很清楚,但我认为答案是应用程序需要的每个类都必须位于类路径或类装入器中,并抛出ClassNotFoundException

    无论您是单独开发人员还是在更大的分布式团队中工作,这都是事实

    根据我的经验,应用程序是单向打包的。如果您只需要一个子集,那么必须将其打包

    如果您的意思是将测试用例作为独立的东西,那么这些测试用例通常不会与生产代码打包在一起

  6. # 6 楼答案

    对于每个项目,这个问题都有不同的答案。几点一般性意见:

    • “运行应用程序的一个子集”通常是不可能的,因为很少有应用程序是模块化的,因此它们的每个部分实际上都可以独立运行
    • 你有时需要的是一个应用核心,以及构建在这个核心上的模块,它们或多或少是相互独立的
    • 最大的区别通常不是拥有与不拥有所有组件之间的区别,而是将它们作为源代码与将它们作为JAR文件之间的区别
    • 在大型应用程序上,开发人员通常只在源代码中包含他们正在处理的部分,其余部分作为JAR文件
    • 如果您需要运行时模块化(即在运行时按需加载和卸载组件),这就是OSGi的用途