在Java中修改外部库中的文件

在Java中修改外部库中的文件,java,spring,maven,spring-social-facebook,Java,Spring,Maven,Spring Social Facebook,我有一个Spring框架项目,它使用Maven来解析依赖项。该项目依赖于另一个Spring项目(SpringSocialFacebook),该项目用于Facebook登录。突然,我开始收到很多错误,因为Facebook登录功能由于Facebook API的更改而中断。该解决方案非常简单,但需要在外部库的文件中进行微小的更改—将变量类型从integer更改为long 现在我知道了解决方案,但我无法控制这个库。我想自己解决这个问题,直到库更新了修复程序,而不是在系统坏了的情况下等待几天 我的问题是:

我有一个Spring框架项目,它使用Maven来解析依赖项。该项目依赖于另一个Spring项目(SpringSocialFacebook),该项目用于Facebook登录。突然,我开始收到很多错误,因为Facebook登录功能由于Facebook API的更改而中断。该解决方案非常简单,但需要在外部库的文件中进行微小的更改—将变量类型从integer更改为long

现在我知道了解决方案,但我无法控制这个库。我想自己解决这个问题,直到库更新了修复程序,而不是在系统坏了的情况下等待几天

我的问题是:有没有简单的方法可以让我更改这个库的源代码,直到库本身有了修复程序?推荐的方法是什么?现在我想到了两件事:分叉库,进行更改,创建一个私有Maven存储库,并用一个使用私有存储库的存储库替换依赖项。如果可以,我想避免这样。我能想到的另一种方法是,分叉库,进行更改,将更新后的库编译成jar文件,并替换Maven依赖项以使用jar文件


有更好的办法吗?在这样的(临时)场景中,您会推荐什么?谢谢

根据工作经验,我在多家公司见过以下方法:

  • 修复源代码中的问题
  • 用相同的Maven坐标再次打包
  • 添加一个分类器,通常是companyname补丁(ed)
  • 将其放入(即Artifactory或Nexus)
因此,您将从

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
</dependency>

朱尼特
朱尼特
4.7


朱尼特
朱尼特
4.7
公司补丁
这将帮助您保持更多的可追溯性:

  • 该分类器向内部开发人员和承包商表明,这是一个公司补丁
  • 您确切地知道修补程序应用于哪个库和哪个版本(因此,部分自记录)
此外,它实际上是对Maven
分类器
特性的合法且良好的使用


重用相同的Maven坐标可能会影响可移植性(我在本地机器上有不同的行为,为什么?)(我将用这个官方的ops来代替。它不再工作了。)

最新的春季Facebook集成库于:


org.springframework.social
春季社交facebook
2.0.2.1发布
自8月份以来,他们的API中只引入了一些小的更改,这极不可能破坏他们与数千个现有应用程序的API兼容性。

实际上有成千上万的应用程序连接到Facebook,因此Facebook不会(不能)允许自己在API中引入突破性的更改。他们有一个复杂的版本控制系统,具有回退和向后兼容等功能,以保护现有的集成


我知道您相信已经找到了库的可能修复方法。我建议您改为研究导致该特定场景的代码。更可能的是,您的代码使用库的方式中的一些细微变化导致了此“错误”,而不是Facebook犯这样的错误。

我发现你的选项1是最好的方法。我不认为更改已经下载的jar是个好主意:使用新的jar和新的坐标听起来更好。它还提供了一个更清晰的意图:你可以将它命名为
this-library-is-break-I-fixed-It
,每个人都会明白你为什么这么做;)。答案不是很清楚,也许很明显,但是:别忘了把你的补丁贡献给原来的项目!我发布了另一个线程的解决方法:。该解决方案允许您按原样使用facebook库,但它通过使用反射更改了
Spring社交facebook
API的某些部分。您不需要编译自己版本的库。目前还没有新的版本。@kamwo实际上,这是我最终使用的解决方案(在GitHub上找到的),因为它对我来说是最快的,但我很高兴仍然收到了我将来可以用于其他问题的答案。谢谢你的解决方案,对我来说很顺利!:-)我还没有深入研究是什么改变了,但现在我专注于找到一个解决方案。但是,我没有更改这个库的版本,这个错误开始自行出现。这里讨论了具体问题:问题是,Jackson映射器试图将
long
值映射到
integer
字段中,但失败了。这是因为facebook增加了视频上传的限制,这超过了“上传者”的范围。更多信息:谢谢你的回答!这是有道理的。但是,您能否详细介绍一下将其放入“企业存储库”的部分?事实上,我还没听说过那个/那个,所以我对那个不太熟悉。我的想法是将其添加到私有存储库中,但这主要是因为我不确定是否可以将其发布到公开可用的存储库中。关于“企业存储库”的部分基本上只是一个建议,以便其他人也可以从修复中受益(在这种情况下,我同意),还是我缺少了什么?谢谢!企业Maven存储库在Maven官方页面上有很好的解释(我用这个链接更新了答案)。实际上,在大公司中,将其用作公共存储库的代理是一种很好的做法(节省带宽,添加一层centra)
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
  <classifier>company-patch</classifier>
</dependency>
<dependency>
  <groupId>org.springframework.social</groupId>
  <artifactId>spring-social-facebook</artifactId>
  <version>2.0.2.RELEASE</version>
</dependency>