lightbend-labs / jardiff Goto Github PK
View Code? Open in Web Editor NEWA tool for comparing JAR files, including method bodies and Scala 2 pickled signatures
License: Apache License 2.0
A tool for comparing JAR files, including method bodies and Scala 2 pickled signatures
License: Apache License 2.0
to ship #103 in particular
(but perhaps there's other changes we should get out there, too)
now that #152 by @mdedetrich is merged, let's make sure we can use it
first, I'll need to add publishing secrets to the GitHub Actions config
scala.tools.jardiff.IOUtilSpec
is failing on Windows and it appears that scala.tools.jardiff.IOUtil.rootPath
needs to be changed so its Windows aware, see #152 (comment)
e.g. https://github.com/lightbend-labs/jardiff/actions/runs/9621753546
looks like Sonatype authentication failure. maybe we need to use a token instead of a user/pass pair?
@mdedetrich https://github.com/lightbend-labs/jardiff/actions/runs/6712606326/job/18242556792 failed with a failed attempt to publish. perhaps the attempt would have succeeded once I added secrets, but I think it shouldn't have even tried? I suggest we not publish after every merged PR, only when a tag was pushed.
java.lang.IllegalArgumentException: Unsupported class file major version 61
Warning: Calling depends_on :java is deprecated! Use "depends_on "openjdk@11", "depends_on "openjdk@8" or "depends_on "openjdk" instead.
Please report this issue to the retronym/formulas tap (not Homebrew/brew or Homebrew/core), or even better, submit a PR to fix it:
/usr/local/Homebrew/Library/Taps/retronym/homebrew-formulas/jardiff.rb:9
% brew install retronym/formulas/jardiff
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
Error: No available formula or cask with the name "retronym/formulas/jardiff".
not sure if somehow caused by retronym/homebrew-formulas#1 , or what? @retronym
Jardiff writes to inaccessible temp directories on cygwin/windows 10. Perhaps my system is to blame, but i thought i'd at least let you know.
jardiff original_jars/com.adobe.granite.auth.saml-0.3.22-CQ600-B0002.jar SamlAuthenticationHandler.class.disassembled/modified_jar/com.adobe.granite.auth.saml-0.3.22-CQ600-B0002.jar
java.nio.file.AccessDeniedException: C:\Users\TIM~1.ZWA\AppData\Local\Temp\jardiff-5317224012050958007\.git\objects\02\53b037b639f215149712695d3412a2f6744766
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
at java.nio.file.Files.delete(Files.java:1126)
at scala.tools.jardiff.IOUtil$$anon$1.visitFile(IOUtil.scala:66)
at scala.tools.jardiff.IOUtil$$anon$1.visitFile(IOUtil.scala:64)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at java.nio.file.Files.walkFileTree(Files.java:2742)
at scala.tools.jardiff.IOUtil$.deleteRecursive(IOUtil.scala:64)
at scala.tools.jardiff.JarDiff.diff(JarDiff.scala:54)
at scala.tools.jardiff.Main$.run(Main.scala:79)
at scala.tools.jardiff.Main$.main(Main.scala:20)
at scala.tools.jardiff.Main.main(Main.scala)
Running the command jardiff --git ~/git/myProject/ test.war prod.war
, generates the following output:
diff --git a/prod.war b/prod.war
new file mode 100644
index 0000000..cdee43a
--- /dev/null
+++ b/prod.war
Binary files differ
diff --git a/test.war b/test.war
deleted file mode 100644
index 808fcae..0000000
--- a/test.war
+++ /dev/null
Binary files differ
It seems that jardiff
sees war archives as binary files. The workaround is to change the extension of the file to .jar
. In that case it works fine.
I presume it's something to do with this line:
git.rm().setCached(true).addFilepattern(".")
Doesn't it need a call()
?
I assume it's trying to remove everything? I don't believe rm
is recursive, though.
ASM desugars certain details when disassembling classfiles, for example it eliminates redundant line numbers:
$ javap -v -cp a C
...
public void t();
...
LineNumberTable:
line 2: 0
line 3: 0
line 4: 3
whereas
$ asm a/C.class
$ cat a/C.asm
...
public t()V
L0
LINENUMBER 3 L0
LDC ""
L1
ASTORE 1
L2
LINENUMBER 4 L2
Would it be possible to publish this repo as a standard Maven JAR into maven central? The main reasoning behind this is to allow for alternate ways to launch jardiff, specifically coursier which for example would allow you to run jardiff which this simple command
cs launch org.scala-lang::jardiff:1.7.0 args
release steps (as per #108):
sbt core/assembly
jardiff.jar
shasum -a 256 jardiff.jar
to compute the SHA
I'm trying to compare changes in some proprietary software, so I can't share the source here, but I'm getting an exception like
java.nio.file.FileSystemException: [...] AppData\Local\Temp\jardiff-7176758906788730580\cON.class.asm: Incorrect function
at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:236)
at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)
at java.base/java.nio.file.Files.newOutputStream(Files.java:224)
at java.base/java.nio.file.Files.newBufferedWriter(Files.java:2997)
at java.base/java.nio.file.Files.newBufferedWriter(Files.java:3040)
at scala.tools.jardiff.AsmTextifyRenderer.render(AsmTextifyRenderer.scala:29)
at scala.tools.jardiff.JarDiff.$anonfun$renderFile$1(JarDiff.scala:107)
at scala.tools.jardiff.JarDiff.$anonfun$renderFile$1$adapted(JarDiff.scala:105)
at scala.collection.immutable.List.foreach(List.scala:312)
at scala.tools.jardiff.JarDiff.renderFile(JarDiff.scala:105)
at scala.tools.jardiff.JarDiff.$anonfun$renderFiles$1(JarDiff.scala:98)
at scala.tools.jardiff.JarDiff.$anonfun$renderFiles$1$adapted(JarDiff.scala:98)
at scala.tools.jardiff.IOUtil$$anon$1.visitFile(IOUtil.scala:47)
at scala.tools.jardiff.IOUtil$$anon$1.visitFile(IOUtil.scala:37)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2804)
at scala.tools.jardiff.IOUtil$.mapRecursive(IOUtil.scala:37)
at scala.tools.jardiff.JarDiff.renderFiles(JarDiff.scala:98)
at scala.tools.jardiff.JarDiff.$anonfun$diff$1(JarDiff.scala:37)
at scala.collection.immutable.List.foreach(List.scala:312)
at scala.tools.jardiff.JarDiff.renderAndCommit$1(JarDiff.scala:34)
at scala.tools.jardiff.JarDiff.$anonfun$diff$3(JarDiff.scala:54)
at scala.collection.Iterator$$anon$9.next(Iterator.scala:554)
at scala.collection.Iterator$GroupedIterator.takeDestructively(Iterator.scala:205)
at scala.collection.Iterator$GroupedIterator.go(Iterator.scala:220)
at scala.collection.Iterator$GroupedIterator.fill(Iterator.scala:257)
at scala.collection.Iterator$GroupedIterator.hasNext(Iterator.scala:261)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1196)
at scala.tools.jardiff.JarDiff.diff(JarDiff.scala:55)
at scala.tools.jardiff.Main$.run(Main.scala:84)
at scala.tools.jardiff.Main$.main(Main.scala:20)
at scala.tools.jardiff.Main.main(Main.scala)
Using java 16. Any ideas what may be causing that?
java -jar jardiff.jar file1.jar file2.jar
java.lang.IllegalArgumentException: Illegal character in opaque part at index 47: jar:file:file1.jar
at java.net.URI.create(Unknown Source)
at scala.tools.jardiff.IOUtil$.rootPath(IOUtil.scala:16)
at scala.tools.jardiff.JarDiff.$anonfun$diff$1(JarDiff.scala:35)
at scala.collection.immutable.List.foreach(List.scala:312)
at scala.tools.jardiff.JarDiff.renderAndCommit$1(JarDiff.scala:34)
at scala.tools.jardiff.JarDiff.$anonfun$diff$3(JarDiff.scala:54)
at scala.collection.Iterator$$anon$9.next(Iterator.scala:554)
at scala.collection.Iterator$GroupedIterator.takeDestructively(Iterator.scala:205)
at scala.collection.Iterator$GroupedIterator.go(Iterator.scala:220)
at scala.collection.Iterator$GroupedIterator.fill(Iterator.scala:257)
at scala.collection.Iterator$GroupedIterator.hasNext(Iterator.scala:261)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1196)
at scala.tools.jardiff.JarDiff.diff(JarDiff.scala:55)
at scala.tools.jardiff.Main$.run(Main.scala:84)
at scala.tools.jardiff.Main$.main(Main.scala:20)
at scala.tools.jardiff.Main.main(Main.scala)
Caused by: java.net.URISyntaxException: Illegal character in opaque part at index 47: jar:file:file1.jar
at java.net.URI$Parser.fail(Unknown Source)
at java.net.URI$Parser.checkChars(Unknown Source)
at java.net.URI$Parser.parse(Unknown Source)
at java.net.URI.<init>(Unknown Source)
... 18 more
Don't ask users to clone and build to run the tool.
Publish binaries, and perhaps offer a homebrew recipe.
Add a convenient way for SBT users to compare the current results of package
to a specified reference version, in the same way as MiMa.
I think this would greatly benefit from being cross-built with Scala Native.
However that has impact on its use of Java library such as JGit.
Is there any possibility to exclude specific files from the diff calculation? I think that would really be an interesting feature.
I've got this exception when tried to compare Jar files for Scala project:
scala.MatchError: ExistentialType(TypeRefType(ThisType(akka.dispatch),akka.dispatch.RequiresMessageQueue,List(TypeRefType(NoPrefixType,TypeSymbol(_$4, owner=24, flags=100, info=162 ),List()))),List(TypeSymbol(_$4, owner=24, flags=100, info=162 ))) (of class scala.tools.scalap.scalax.rules.scalasig.ExistentialType)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.toString(ScalaSigPrinter.scala:331)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.toString(ScalaSigPrinter.scala:324)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printType(ScalaSigPrinter.scala:320)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printMethodType(ScalaSigPrinter.scala:219)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printMethod(ScalaSigPrinter.scala:258)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printSymbol(ScalaSigPrinter.scala:63)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.$anonfun$printChildren$1(ScalaSigPrinter.scala:90)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.$anonfun$printChildren$1$adapted(ScalaSigPrinter.scala:90)
at scala.collection.immutable.List.foreach(List.scala:312)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printChildren(ScalaSigPrinter.scala:90)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printClass(ScalaSigPrinter.scala:146)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printSymbol(ScalaSigPrinter.scala:61)
at scala.tools.scalap.scalax.rules.scalasig.ScalaSigPrinter.printSymbol(ScalaSigPrinter.scala:30)
at scala.tools.scalap.Main.parseScalaSignature(Main.scala:89)
at scala.tools.scalap.Main.decompileScala(Main.scala:98)
at scala.tools.jardiff.ScalapRenderer.render(ScalapRenderer.scala:18)
at scala.tools.jardiff.JarDiff.$anonfun$renderFile$1(JarDiff.scala:107)
at scala.tools.jardiff.JarDiff.$anonfun$renderFile$1$adapted(JarDiff.scala:105)
at scala.collection.immutable.List.foreach(List.scala:312)
at scala.tools.jardiff.JarDiff.renderFile(JarDiff.scala:105)
at scala.tools.jardiff.JarDiff.$anonfun$renderFiles$1(JarDiff.scala:98)
at scala.tools.jardiff.JarDiff.$anonfun$renderFiles$1$adapted(JarDiff.scala:98)
at scala.tools.jardiff.IOUtil$$anon$1.visitFile(IOUtil.scala:47)
at scala.tools.jardiff.IOUtil$$anon$1.visitFile(IOUtil.scala:37)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at scala.tools.jardiff.IOUtil$.mapRecursive(IOUtil.scala:37)
at scala.tools.jardiff.JarDiff.renderFiles(JarDiff.scala:98)
at scala.tools.jardiff.JarDiff.$anonfun$diff$1(JarDiff.scala:37)
at scala.collection.immutable.List.foreach(List.scala:312)
at scala.tools.jardiff.JarDiff.renderAndCommit$1(JarDiff.scala:34)
at scala.tools.jardiff.JarDiff.$anonfun$diff$3(JarDiff.scala:54)
at scala.collection.Iterator$$anon$9.next(Iterator.scala:554)
at scala.collection.Iterator$GroupedIterator.takeDestructively(Iterator.scala:205)
at scala.collection.Iterator$GroupedIterator.go(Iterator.scala:220)
at scala.collection.Iterator$GroupedIterator.fill(Iterator.scala:257)
at scala.collection.Iterator$GroupedIterator.hasNext(Iterator.scala:261)
at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1196)
at scala.tools.jardiff.JarDiff.diff(JarDiff.scala:55)
at scala.tools.jardiff.Main$.run(Main.scala:84)
at scala.tools.jardiff.Main$.main(Main.scala:20)
at scala.tools.jardiff.Main.main(Main.scala)
Currently sbt assembly has a single core
project that implements everything however it makes sense to separate the core
into core
and cli
(i.e. the cli runner that uses "commons-cli"
) with the intent that only core
gets published to maven and cli is what the assembly jar is made out of.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.