我正在开发一个模块化的网络应用程序,我正在使用maven。 我的申请的骨架如下:
我的应用程序的骨架与共享服务模块
现在我想在Service-App2中导入一些Service-App1类,但没有Service-App1依赖项(如Module-App1,Util-App1和外部依赖项)。
总结一下,因为在App2中我有一个复合持久性单元Composite Persistence Unit,我想在应用程序之间共享一些业务逻辑。例如,如果在App1中我有这样的弹簧服务:
public interface ContractService {
void processSomethings();
}
@Service
public class ContractServiceImpl implements ContractService {
public void processSomethings(){
//Manage some share entities
}
}
我想要使用方法
processSomethings()
也在App1中 我怎么能意识到这一点?
答案 0 :(得分:1)
我认为你不能,我当然希望不会。
OO编程的一个想法是封装,其中包括隐藏您正在使用的类的实现细节的想法。您不应该知道它依赖于哪些类,尽管您应该能够发现它使用的库。但是为了在库中使用该类,您不应该只从库中挑选出您认为需要的类;我们无法保证你所需要的人能够工作。
答案 1 :(得分:1)
您需要在maven依赖项中添加<exclusions>
部分,并列出您不想继承的传递依赖项。
例如,如果我的pom.xml有一个<dependencies>
部分,如下所示:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
...然后当我做mvn dependency:tree
时,我得到以下输出:
[INFO] ------------------------------------------------------------------------
[INFO] Building scratch 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ scratch ---
[INFO] com.nppc.mes:scratch:jar:0.0.1-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO] \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
如果我确定我真的不想在我的项目中使用hamcrest-core
依赖项,我可以修改我的pom.xml以将其排除在外:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
...它给了我一个mvn dependency:tree
输出:
[INFO] ------------------------------------------------------------------------
[INFO] Building scratch 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ scratch ---
[INFO] com.nppc.mes:scratch:jar:0.0.1-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
答案 2 :(得分:1)
您需要创建一个项目(jar输出),该项目仅包含两个使用者之间共享的类。这看起来似乎是一种开销,但它会导致干净整齐的代码。如果您不能这样做,则表明您有一个混乱的依赖层次结构。我经常这样做以实现Web服务客户端和服务,共享jar包含共同的类(即客户端应该对DAO类一无所知,但需要知道Web服务操作的签名。它还需要可以访问定义数据和消息结构的POJO类。
另外,你在运行时需要hamcrest依赖吗?我的经验是它通常可以将其范围设置为测试,因此它在编译的工件中永远不会出现。
我不是转换为父母poms,当然也不会考虑你展示的两级父pom结构。我的反对意见是:
我想听听关于这个话题的合理论证。