1.准备好需要修改的Jar包,准备好包含源码的source Jar包;
2.解压缩source jar包,修改source代码,然后javac编译;
3.用winrar打开待修改的Jar包,把步骤2编译好的class文件直接拖进来放到相应目录。
最近在研究图数据库neo4j,用的spring-boot开发,其中需要用“@Properties”创建动态属性,会引用到:
org.neo4j
neo4j-ogm-core
3.1.11
定义了一个商品实体:
@NodeEntity(label = "商品")
public class GoodsDomain {
@Id
@GeneratedValue
private Long id;
/**
* 品牌id
*/
@Property("bid")
private Long brandId;
/**
* 类目id
*/
@Property("cid")
private Long categoryId;
/**
* 商品名
*/
@Property("name")
private String goodsName;
/**
* originId配置唯一性索引,即同一个域下的originid是惟一的
*/
// @Index(unique = true)
@Property("origin_id")
private Long originId;
/**
* 商品类型
*/
@Property("type")
private String goodsType;
@Properties
private Map properties = new HashMap<>();
// getter/setter
}
我们希望在创建商品节点时,能够附带上商品的知识属性,例如使用方法、适用年龄、成分含量,因为不同的商品包含的知识有所不同,因此需要把知识放在properties里面,这是一个Map,我们可以从外部往里面塞值。
接着我们定义repository:
package com.example.biglong.neo4j.repositories;
import com.example.biglong.neo4j.domain.GoodsDomain;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface GoodsRepository extends Neo4jRepository {
}
现在我们来调用该Repository创建商品:
package com.example.biglong.neo4j.controller;
import com.example.biglong.common.CommonResponse;
import com.example.biglong.neo4j.domain.GoodsDomain;
import com.example.biglong.neo4j.repositories.GoodsRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @Description 知识图谱
* @Author lilong
* @Date 2019-07-25 17:06
*/
@RestController
@RequestMapping("/graph")
public class KnowledgeGraphController {
@Autowired
private GoodsRepository goodsRepository;
private static final Logger logger = LogManager.getLogger(KnowledgeGraphController.class);
/**
* 初始化创建类目、品牌、商品实体和关系
* @return
*/
@RequestMapping(value = "/init", method = {RequestMethod.GET})
@ResponseBody
public CommonResponse init() {
GoodsDomain goodsDomain = new GoodsDomain();
goodsDomain.setBrandId(9L);
goodsDomain.setCategoryId(10L);
goodsDomain.setGoodsName("凌美钢笔");
goodsDomain.setGoodsType("虚拟组合商品");
goodsDomain.setOriginId(10086L);
Map properties = new HashMap<>();
properties.put("适用群体","婴幼儿");
properties.put("产地", "墨西哥");
properties.put("适用年龄", "通用");
properties.put("重量", "0.9kg");
goodsDomain.setProperties(properties);
goodsRepository.save(goodsDomain);
logger.info("########### save goodsDomain success.");
return CommonResponse.succ();
}
}
执行结果是这样的:
属性前面自动加了前缀“properties.”,取了字段名+"."做的默认前缀,Jar包代码里也的确这么定义的,你可以在“@Properties”注解后面指定前缀(prefix = "指定前缀"),它就会生成“前缀.产地”,但是只要你不指定、或者指定为空字符串,他就会给你加上上图这么一个默认前缀,这就没办法了,只能修改Jar包了。
我们这里介绍的是有源码的情况,没有源码、只有class文件的情况本文尚无法解决。
打开maven本地仓库,找到待修改的Jar包,这里是“neo4j-ogm-core-3.1.11.jar”,找到源码包,就是下面的“neo4j-ogm-core-3.1.11-sources.jar”:
我们把源码包解压出来,随便什么软件,比如winrar:
注意META-INF和org是解压出来的,lib文件夹是我解压后手动加进来的,因为等会用javac命令编译源码的时候需要引用这里面的jar包。
接下来我们找到待修改的java文件进行修改,比如这里修改了以下3个文件:
org/neo4j/ogm/metadata/FieldInfo.java
org/neo4j/ogm/annotation/Properties.java
org/neo4j/ogm/typeconversion/MapCompositeConverter.java
例如 FiledInfo.java:
修改后的源码需要编译成class文件,我们定位到 /neo4j-ogm-core-3.1.11-sources/这个目录下,打开cmd命令窗口:
接着使用javac命令把java源码编译成class文件,有外部Jar包依赖的需要把cp命令带上,没有不用带:
javac -cp .;lib/slf4j-api-1.7.25.jar;lib/commons-lang3-3.8.jar org/neo4j/ogm/metadata/FieldInfo.java
javac org/neo4j/ogm/annotation/Properties.java
javac -cp .;lib/slf4j-api-1.7.25.jar;lib/commons-lang3-3.8.jar org/neo4j/ogm/typeconversion/MapCompositeConverter.java
依次输入以上3条命令、回车,去刚才源码的地方看看,已经有编译好的class文件了:
用winrar打开需要修改的jar包:
找到需要替换的class文件,直接把上一步编译好的class文件拖进来。
替换完成之后,我们再次运行代码,看到创建出来的商品已经符合我们的要求了:
用图可能更直观点:
最后附上我我修改后的Jar包,有需要的可以直接下载:
百度网盘:neo4j-ogm-core-3.1.11.jar
提取码:bb96