修改Jar包里的单个class文件

步骤简述:

1.准备好需要修改的Jar包,准备好包含源码的source Jar包;

2.解压缩source jar包,修改source代码,然后javac编译;

3.用winrar打开待修改的Jar包,把步骤2编译好的class文件直接拖进来放到相应目录。

一、问题背景

最近在研究图数据库neo4j,用的spring-boot开发,其中需要用“@Properties”创建动态属性,会引用到:

<!-- https://mvnrepository.com/artifact/org.neo4j/neo4j-ogm-core -->
<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm-core</artifactId>
    <version>3.1.11</version>
</dependency>

定义了一个商品实体:

@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<String, String> 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<GoodsDomain, Long> {
}

现在我们来调用该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<String, String> 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”:

1.修改源码

我们把源码包解压出来,随便什么软件,比如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:

 

 

2.编译源码

修改后的源码需要编译成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文件了:

3.替换掉原先Jar包里的class文件

用winrar打开需要修改的jar包:

找到需要替换的class文件,直接把上一步编译好的class文件拖进来。

三、测试

替换完成之后,我们再次运行代码,看到创建出来的商品已经符合我们的要求了:

用图可能更直观点:

 

最后附上我我修改后的Jar包,有需要的可以直接下载:

百度网盘:neo4j-ogm-core-3.1.11.jar

提取码:bb96

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值