gpt4 book ai didi

java - 在 Java 中实现分层架构

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:30 25 4
gpt4 key购买 nike

给定一个用 Java 编写的软件系统,由三层组成,A -> B -> C,即 A 层使用 B 层,B 使用 C 层。

我想确保一层的类只能访问同一层的类或其直接依赖项,即 B 应该能够访问 C 但不能访问 A。此外,A 应该能够访问 B 但不是C。

是否有一种简单的方法来执行这种限制?理想情况下,如果有人试图访问错误层的类,我希望 eclipse 立即提示。

软件目前使用maven。因此,我尝试将 A、B 和 C 放入不同的 Maven 模块并正确声明依赖项。这可以很好地阻止 B 访问 A,但不会阻止 A 访问 C。

接下来我尝试将 C 从对 B 的依赖中排除。这现在也阻止了从 A 到 C 的访问。但是现在我不再能够使用复制依赖来收集运行时所需的所有传递依赖。

有没有一种好方法可以让我清楚地分离层,但也允许我收集所有需要的运行时依赖项?

最佳答案

在 maven 中,您可以使用 maven-macker-plugin,如下例所示:

<build>
<plugins>
<plugin>
<groupId>de.andrena.tools.macker</groupId>
<artifactId>macker-maven-plugin</artifactId>
<version>1.0.2</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>macker</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

这里是一个 macker-rules.xml 示例文件:(将它放在与您的 pom.xml 相同的级别)

<?xml version="1.0"?>
<macker>

<ruleset name="Layering rules">
<var name="base" value="org.example" />

<pattern name="appl" class="${base}.**" />
<pattern name="common" class="${base}.common.**" />
<pattern name="persistence" class="${base}.persistence.**" />
<pattern name="business" class="${base}.business.**" />
<pattern name="web" class="${base}.web.**" />

<!-- =============================================================== -->
<!-- Common -->
<!-- =============================================================== -->
<access-rule>
<message>zugriff auf common; von überall gestattet</message>
<deny>
<to pattern="common" />
<allow>
<from>
<include pattern="appl" />
</from>
</allow>
</deny>
</access-rule>

<!-- =============================================================== -->
<!-- Persistence -->
<!-- =============================================================== -->
<access-rule>
<message>zugriff auf persistence; von web und business gestattet</message>
<deny>
<to pattern="persistence" />
<allow>
<from>
<include pattern="persistence" />
<include pattern="web" />
<include pattern="business" />
</from>
</allow>
</deny>
</access-rule>

<!-- =============================================================== -->
<!-- Business -->
<!-- =============================================================== -->
<access-rule>
<message>zugriff auf business; nur von web gestattet</message>
<deny>
<to pattern="business" />
<allow>
<from>
<include pattern="business" />
<include pattern="web" />
</from>
</allow>
</deny>
</access-rule>

<!-- =============================================================== -->
<!-- Web -->
<!-- =============================================================== -->
<access-rule>
<message>zugriff auf web; von nirgends gestattet</message>
<deny>
<to pattern="web" />
<allow>
<from>
<include pattern="web" />
</from>
</allow>
</deny>
</access-rule>

<!-- =============================================================== -->
<!-- Libraries gebunden an ein spezifisches Modul -->
<!-- =============================================================== -->
<access-rule>
<message>nur in web erlaubt</message>
<deny>
<to>
<include class="javax.faces.**" />
<include class="javax.servlet.**" />
<include class="javax.ws.*" />
<include class="javax.enterprise.*" />
</to>
<allow>
<from pattern="web" />
</allow>
</deny>
</access-rule>

<access-rule>
<message>nur in business und persistence erlaubt</message>
<deny>
<to>
<include class="javax.ejb.**" />
<include class="java.sql.**" />
<include class="javax.sql.**" />
<include class="javax.persistence.**" />
</to>
<allow>
<from>
<include pattern="business" />
<include pattern="persistence" />
</from>
</allow>
</deny>
</access-rule>

</ruleset>

</macker>

在一个简单的多模块 maven 项目中,只需将 macker-rules.xml 放在中心位置并指向它存储的目录即可。然后你需要在你的父 pom.xml 中配置插件

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>de.andrena.tools.macker</groupId>
<artifactId>macker-maven-plugin</artifactId>
<version>1.0.2</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>macker</goal>
</goals>
<configuration>
<rulesDirectory>../</rulesDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>

关于java - 在 Java 中实现分层架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27984854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com