JaVers 技术文档

JaVers 技术文档

javers JaVers - object auditing and diff framework for Java javers 项目地址: https://gitcode.com/gh_mirrors/ja/javers

JaVers 是一个轻量级的 Java 库,专门用于审计数据中的变更。在源代码管理中有版本控制系统,那么为何不在Java对象(实体、POJO、数据对象)上使用专门框架来生成审计跟踪呢?本文档旨在帮助您了解、安装并高效地使用JaVers。

安装指南

Maven 添加依赖

对于Maven用户,将以下依赖添加到您的pom.xml文件中:

<dependency>
    <groupId>org.javers</groupId>
    <artifactId>javers-core</artifactId>
    <version>确保使用最新版本,可以通过访问Maven中央仓库获取。</version>
</dependency>

Gradle 添加依赖

如果您使用Gradle,可以在build.gradle文件中加入:

dependencies {
    implementation 'org.javers:javers-core:最新版本'
}

确保替换“最新版本”为实际的JaVers版本号,可通过java.org查找。

项目的使用说明

JaVers的核心功能是记录和查询Java对象的变更。简单示例:

  1. 创建Javers实例

    在应用启动时初始化Javers实例:

    Javers javers = JaversBuilder.javers().withSqlRepository(SqlSchemaType.MYSQL).build();
    
  2. 注册您的domain类

    在使用JaVers之前,需要让其知道您想要审计的类。

  3. 执行变更并记录

    当对象状态发生变化时,使用compare()registerSnapshot()方法记录变更。

    MyEntity before = ...;
    MyEntity after = ...;
    ChangeList changes = javers.compare(before, after);
    javers.commit("author", changes);
    

项目API使用文档

JaVers提供了丰富API来处理对象变更。

  • Diff API:通过比较两个对象的状态来获取变更列表。

    ChangeList changes = javers.diff(oldObject, newObj);
    
  • Commit API:将变更记录到存储中。

    javers.commit肖像, "用户名", changes);
    
  • Query API:使用JaVers Query Language (JQL) 来检索特定的变更记录。

    List<Change> changesForProperty = javers.queryChangesByProperty(MyEntity.class, "propertyName");
    

项目构建方式

为了从源码构建JaVers,您需要Git和Gradle。

  1. 克隆仓库

    git clone https://github.com/javers/javers.git
    cd javers
    
  2. 构建并测试

    使用Gradle进行构建及运行单元测试:

    ./gradlew build
    

    运行自检以确认兼容性:

    ./gradlew javers-core:run
    

JaVers是一个开源项目,鼓励社区参与贡献。查看CONTRIBUTING.md了解更多贡献方式。


以上就是JaVers的基本使用和技术要点。更多高级特性和详细配置,请参考官方网站的官方文档。希望这能帮助您有效地使用JaVers来审计和追踪数据变更。

javers JaVers - object auditing and diff framework for Java javers 项目地址: https://gitcode.com/gh_mirrors/ja/javers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

### Java 中实现差异比较(Diff)算法 #### 方法概述 在Java中,可以采用多种方法来实现差异比较(Diff)算法。这些方法通常基于不同的逻辑和技术栈,适用于不同场景下的需求。 #### 自定义 Diff 算法实现 一种常见的自定义实现方式是通过递归或迭代的方式对比两个对象树,并记录它们之间的区别。下面是一个简单的例子,展示了如何利用深度优先遍历来构建一个基础版本的Diff工具[^1]: ```java public class SimpleDiff { public static void main(String[] args) { Node baseTree = new Node("root", Arrays.asList( new Node("childA"), new Node("childB") )); Node targetTree = new Node("root", Arrays.asList( new Node("childA"), new Node("modifiedChildB") // Modified node )); List<String> diffs = compareTrees(baseTree, targetTree); System.out.println(diffs); // Output differences between trees. } private static List<String> compareTrees(Node base, Node target){ List<String> changes = new ArrayList<>(); if (!base.getValue().equals(target.getValue())) { changes.add("Node value changed from " + base.getValue() + " to " + target.getValue()); } Map<String, Node> baseChildrenMap = buildValueToNodeMap(base.getChildren()); Map<String, Node> targetChildrenMap = buildValueToNodeMap(target.getChildren()); Set<String> allKeys = new HashSet<>(baseChildrenMap.keySet()); allKeys.addAll(targetChildrenMap.keySet()); for (String key : allKeys) { boolean isBasePresent = baseChildrenMap.containsKey(key); boolean isTargetPresent = targetChildrenMap.containsKey(key); if(isBasePresent && !isTargetPresent){ changes.add("Removed child with value: "+key); }else if(!isBasePresent && isTargetPresent){ changes.add("Added child with value: "+key); }else{ changes.addAll(compareTrees(baseChildrenMap.get(key),targetChildrenMap.get(key))); } } return changes; } private static Map<String, Node> buildValueToNodeMap(List<Node> nodes){ return nodes.stream() .collect(Collectors.toMap(Node::getValue, Function.identity())); } } class Node { private String value; private final List<Node> children; public Node(String value) { this(value, Collections.emptyList()); } public Node(String value, List<Node> children) { this.value = value; this.children = children; } public String getValue(){ return value; } public List<Node> getChildren(){ return children; } } ``` 此代码片段展示了一个简易版的节点树结构及其对应的Diff函数`compareTrees()`。该函数接收两棵以相同根节点起始的树作为输入参数,并返回描述两者之间区别的列表。 #### 使用第三方库 除了自行编写外,还可以借助一些成熟的开源项目简化开发过程。以下是几个常用的Java Diff库以及其简单介绍: - **Google Guava**: 提供了丰富的集合处理能力,其中包含了用于计算集合间差集的功能。 - **Apache Commons Lang**: 包含了许多实用工具类,比如StringUtils类提供了字符串相似度匹配等功能,在某些情况下可用于辅助完成简单的文本差异分析工作。 - **Javers**: 是一款专注于领域模型变更追踪的强大框架,支持复杂的数据结构如JSON/XML/POJO等类型的对象图谱变化检测。 对于更专业的文件级或者行级别的差异比较,则推荐考虑以下专用库: - **JDiff**: JDiff是一款专门针对XML文档设计的Diff工具,能够高效地找出并可视化显示源码间的细微差别。 - **DeltaSpike Data Module**: DeltaSpike提供了一套完整的解决方案来进行数据库表记录层面的变化捕捉与同步管理。 为了更好地理解具体应用场景的选择依据,请参阅官方文档获取更多信息关于各个选项的支持特性及性能指标等方面的内容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姬佩璇Falkner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值