如何解决Maven的循环问题?

我有这种依赖的状况:

C( - >)B - > A - >Ç

其中,B-> C表示该模块C具有相关性在其pom.xml中到B。

嗯......我想在C中使用类选自B,所以我必须把C->乙但是我收到一个骑自行车的错误,你可以在上面看到...

你看到什么解决办法? 因为它已经使用了一些类从A会有再次循环我不能移动类选自B在C中。

我试图声明一个接口IAlfa C和B中实现它(阿尔法)(但是当我想用它,我需要实例,如:

IAlfa alfa = new Alfa()

所以我又需要从B.进口阿尔法

你怎么看?

谢谢。

--------------解决方案-------------

这不应该发生。 我通常做的是有一个模块的结构是这样的:

root
- api (interfaces, enums and custom exceptions only)
- impl (standard implementation of api -> dependency to api)
- server (runtime dependency to impl, compile time to api only)
- client (dependency to api only)

比方说,我们有一个接口Person的的api模块。 现在,在impl模块,你有一个类JpaPerson因为impl使用JPA。 然而,这些都是细节,客户端和服务器不需要了,所以你不应该(在我的设计不能)做new JpaPerson()在任一clientserver 。 相反,你就会有一个接口(也在里面api称为PersonFactory听起来很可怕,当你在谈论的人,也许它命名为更人性化),有这样的方法:

public interface PersonFactory{

Person findPersonBySsn(String socialSecurityNumber);
List<Person> findPersonsByName(String firstName, String lastName);
List<Person> findPersonByBirthDate(Date birthDate);
Person createPerson(
String firstName, String lastName,
Date birthDate, String socialSecurityNumber
);

}

再次,实现在该接口impl的模块,但其引用为仅在其他模块的接口。 然后使用依赖注入到线东西放在一起(春,缝,EJB3,等等)。

你提的情况是代码做的事情,超出了它的责任,结果是(阅读关注点分离)。

伟大的优势,这样的设计是,你可以重构所有的模块(除api独立,而不在其他模块更改代码。 所以,如果你想从JPA经典休眠切换,您只需编辑impl 。 如果你想在服务器从轴切换到CXF,只是改变server 。 这使事情变得更加简单。 当然,你没有得到循环依赖。


编辑:

你一个简单的(简单)的解决办法是引入被列为A,B和C的依赖一个模块D。 将所有常用的代码为D。 (其实重命名此d到a和A,B,C到B,C,D)。

这种情况似乎是坏的类/图书馆组织的症状。

这似乎非常奇怪,你会合法地进入这种情况(随意解释更精确,你如何组织你的类,如果你想讨论)

如果你有完全的控制A,B和C的成分,你可以做至少有以下几点:

  1. 合并A,B和C到一个库中,并用它做。 (不推荐 - 它会使良好的模块化几乎是不可能的)
  2. 你需要使用一个在C B级,为了做一个工作W.不要在库ð的工作来代替。
  3. 从A从中B级取决于移动你想要的B级,“和”的类,在C.

有一对夫妇的事情要做。

首先开始的神器C中的所有的方式,通过一个用mvn dependency:analyze验证什么依赖性真正被使用,在你的不仅是声明pom.xml该Maven插件是作为调试你的依赖关系树的第一步非常有用的。 它可能的情况是,但是也有一些只是声明但尚未使用的一些相关性,和/或使用,但是没有宣布等

一旦您确认您的依赖关系树的真实状态,那么你应该开始搬东西,如果你的依赖分析的步骤还没有证明就可以轻松解决任何重大问题。

我不知道你的问题有多深,因为你还没有发布任何配置,或代码剪断,但你可以在C的尝试pom.xml是这样的:

<dependency>
<groupId>org.sample</groupId>
<artifactId>module-b</artifactId>
<exclusions>
<exclusion>
<groupId>org.sample</groupId>
<artifactId>module-c</artifactId>
</exclusion>
</exclusions>
</dependency>

要排除B的这是从一个的传递性地继承了C相关性。

大多数时候,我一定要解决这样的问题,我明确声明的依赖在POM文件,然后添加一个EXCLUDES子句的依赖问题。 这样,我敢肯定,我得到我想要的版本。 它的更多的工作,但它可以节省您不必在WAR文件12份共享记录。 ;)

分类:java的 时间:2012-01-01 人气:0
本文关键词: java的,行家2,行家
分享到:

相关文章

  • 小型的Java项目不断增长(行家和JUnit) 2012-07-31

    我正在不断增长的Java项目,我可能会与别人合作,以改善某些功能. 我想使用一些工具来提高我的工作保持质量记住: 我没有太多的时间花费在这个项目上 这是一个小项目,但它真的很重要,我 我不想买的软件/硬件为它 我已经使用SVN 你觉得关于Maven和JUnit? 是值得花时间又在哪里? 你知不知道任何其他好的工具吗? --------------解决方案------------- 既然你不使用JUnit我的猜测是,你没有任何的单元测试呢. 这似乎我要你拿,如果其他人将开始处理您的代码中最重要的一

  • Java的Netbeans的BeanCreationException 2013-06-15

    我试着去部署的NetBeans Java EE项目(行家+休眠+ JSF)在GlassFish 即时得到下面的错误. 我的数据库配置是确定的(双从几个应用程序检查),而数据库本身是确定和在线. SEVERE: WebModule[/web-0.1-SNAPSHOT]PWC1275: Exception sending context initialized event to listener instance of class org.springframework.web.context.Co

  • Java的环境变量困境,Maven的还 2013-07-27

    所以,我重新安装java中不具有任何的空间,因为我与它的问题之前,一个目录. Java的JDK安装在: E:\downloads\java\jdk 我创建了一个用户变量: JAVA_HOME E:\downloads\java\jdk 而我的路径是这样的: %JAVA_HOME%\bin;%M2%; 现在打开一个新的命令提示符: c:\java 'java' is not recognized... 但呼应的作品: c:\echo %JAVA_HOME% E:\downloads\java\jd

  • 抛出java.lang.ClassNotFoundException:com.mysql.jdbc.Driver(行家+的JBoss) 2012-01-07

    行家的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"> <

  • 抛出java.lang.ClassNotFoundException:运行时(日食/行家/ Tomcat)的过程中com.mysql.jdbc.Driver 2012-08-04

    在运行的Tomcat我得到这个错误"抛出java.lang.ClassNotFoundException:com.mysql.jdbc.Driver". 我使用Eclipse(靛蓝,J2EE版本)/ Maven的(M2E-WTP)/ Tomcat的7.0的组合. 我已经包括在我的POM文件这依赖于我的Web应用程序(从头构建). <dependency> <groupId>mysql</groupId> <artifactId>mysql

  • 为什么行家需要这么多的选项来创建一个Hello World项目,你能推荐一个Java的更专用的构建工具? 2013-01-14

    从这里引述: mvn archetype:generate -DgroupId=org.sonatype.mavenbook.simple \ -DartifactId=simple \ -DpackageName=org.sonatype.mavenbook \ -Dversion=1.0-SNAPSHOT 而且我也必须指定一个原型数... 如此看来,Maven是不会满足于只是一个Java 构建工具,但要控制发展的各个方面... 有人可以推荐一个Java的真敬业构建工具? ----------

  • Java EE的API是在项目类路径中失踪,同时使用httpunit的在行家的servlet测试 2013-11-04

    我想使用maven运行的servlet测试的例子可以在这里找到. 作为JavaEE的网页API应该声明provided : <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependenc

  • 为什么行家突然开始使用旧版本的Java编译的? 2014-04-30

    我在现在的Java使用maven几天一直在开发. 今天我编辑根据这些说明我的pom.xml. 突然运行mvn compile是给我的错误,如果我是用一个旧版本的Java编译. 这样的东西: 错误:泛型是不-source 1.3支持 现在,我已经配对我的pom.xml回原来的内容,而且我还收到此错误. 我已经做了mvn clean和目标下,删除了一切,我仍然有这个问题. 下面是运行编译阶段的Maven的一个片段: [INFO]扫描项目... [INFO] [INFO] --------------

  • 在行家2编译设置java系统属性? 2014-09-25

    我有一个maven配置文件,并要设置Java中的财产也就是后来的每System.getProperty可用(..): <profile> <id>local-dev</id> <properties> <my.comp.my.prop>myValue</my.comp.my.prop> </properties> </profile> 我想System.getProperty("my.comp.my.

  • Java的W /行家:从JAR文件中获得源 2014-10-22

    我写一个GUI应用程序,以及使用图像文件(GIF)为图标. 当我在IDE中运行应用程序 - 图标显示. 当我从一个罐子运行它 - 他们失败(在资源空指针异常) 包结构是如下: 代码:钢骨混凝土/主/ JAVA / COM /我的/应用程序 资源:钢骨混凝土/主/资源/ COM /我的/应用程序 我写了这个小例子: URL url ; url = GuiUtils.class.getResource("/com/my/app/gui/fading_lines_blue_64x64.gif"

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.559 (s). 10 q(s)