Git Product home page Git Product logo

jarjar-abrams's Introduction

Jar Jar Abrams

Continuous Integration Maven Central

Jar Jar Abrams is an experimental Scala extension of Jar Jar Links a utility to shade Java libraries.

Jar Jar Links

In 2004, herbyderby (Chris Nokleberg) created a tool called Jar Jar Links that can repackage Java libraries.

Now defunct fork of Jar Jar Links by Pants was in-sourced at commit 57845dc73d3e2c9b916ae4a788cfa12114fd7df1, dated Oct 28, 2018.

Jar Jar Uber Jar

Published as: "com.eed3si9n.jarjar" % "jarjar-assembly" % <version>

License

Licensed under the Apache License, Version 2.0.

Credits

jarjar-abrams's People

Contributors

alessandropatti avatar bantonsson avatar cdegroc avatar cdkrot avatar cheister avatar damdev avatar daniellansun avatar dturner-tw avatar eed3si9n avatar er1c avatar eric-poitras avatar ericdotdata avatar gabrielrussoc avatar gmalmquist avatar jamiees2 avatar jeroentervoorde avatar joan38 avatar johnedmonds avatar jsirois avatar kterusaki avatar mernst avatar patrick-premont avatar pomadchin avatar retronym avatar sethtisue avatar shanielh avatar stremlenye avatar vladimirkl avatar wxiang7 avatar xuwei-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jarjar-abrams's Issues

Jarjar mangles classes even when no meaningful transformation applied

Hey! I have the following problem.

In case big module and all it dependent jars are going through jarjar shading, there will probably be dependent jars which are not actually modified by shading.

However because they go through jarjar, it unpacks, revisits, and repacks the class back resulting a technically different class from before shading (even class size can be different from original). This upsets classpath checkers (i.e. checking that runtime classpath has at most 1 unique class version).

I propose to add a change so that jarjar can detect whether the meaningful transformation to class file has happened and if not, the class is unmodified.

If this aligns with your vision as well, I can share the actual implementation scratch I have. It augments MethodSignatureProcessor and JarTransformerChain so that they track whether the meaningful transformation to class file has happened and if not, the original byte array is returned.

cc @AlessandroPatti

Kotlin Metadata is not relocated

I posted in bazel_jar_jar's github as well, in case it's an issue with their use of jarjar-abrams: bazeltools/bazel_jar_jar#46

I used bazel_jar_jar to relocate graphql to graphql13 in this lib:

jar_jar(
    name = "graphql_kotlin_schema_generator_shaded",
    inline_rules = ["rule graphql.** graphql13.@1"],
    input_jar = "@maven//:com_expediagroup_graphql_kotlin_schema_generator",
    visibility = ["//visibility:private"],
)

When I look at the decompiled class files, I see import graphql13..., but for the same class, in the kotlin metadata annotation, I see graphql/schema:

Screenshot 2024-01-24 at 4 30 00 PM Screenshot 2024-01-25 at 2 18 58 PM

sbt build warnings

When I run sbt (version 1.10.1) , I get the following warnings:

jarjar-abrams/build.sbt:21: warning: value IntegrationTest in trait LibraryManagementSyntax is deprecated (since 1.9.0): Create a separate subproject for testing instead
  .configs(IntegrationTest)
           ^
jarjar-abrams/build.sbt:22: warning: lazy value itSettings in object Defaults is deprecated (since 1.9.0): Create a separate subproject instead of using IntegrationTest and in addition avoid using itSettings
  .settings(Defaults.itSettings)
                     ^
jarjar-abrams/build.sbt:41: warning: value IntegrationTest in trait LibraryManagementSyntax is deprecated (since 1.9.0): Create a separate subproject for testing instead
    IntegrationTest / fork := true
    ^
jarjar-abrams/build.sbt:42: warning: value IntegrationTest in trait LibraryManagementSyntax is deprecated (since 1.9.0): Create a separate subproject for testing instead
    IntegrationTest / envVars := Map(
    ^

ShadeRules.keep is broken

Looks like something broke in the upstream:

package org.pantsbuild.jarjar

import verify._
import org.pantsbuild.jarjar.util.EntryStruct
import java.util.Collections

object KeepSpec extends BasicTestSuite {
  val keep = new Keep()
  keep.setPattern("org.**")
  val keepProcessor = new KeepProcessor(Collections.singletonList(keep))

  test("include") {
    val entryStruct = new EntryStruct
    entryStruct.name = "org/example/Object.class"
    assert(true == keepProcessor.process(entryStruct))

  }

  test("exclude") {
    val entryStruct = new EntryStruct
    entryStruct.name = "com/example/Object.class"
    assert(false == keepProcessor.process(entryStruct))
  }
}
sbt:jarjar-abrams> test
Error reading org/example/Object.class: null
Error reading com/example/Object.class: null
[info] testpkg.EntryTableSpec
[info] - entry table should parse annotation bytes
[info] - entry table should rename package
[info] - entry table should return same serialized bytes
[info] org.pantsbuild.jarjar.KeepSpec
[info] - include
[info] - exclude *** FAILED ***
[info]   assertion failed
[info]
[info]   assert(false == keepProcessor.process(entryStruct))
[info]                |                |       |
[info]                false            true    org.pantsbuild.jarjar.util.EntryStruct@7fa491e4
[info]     verify.asserts.PowerAssert$AssertListener.expressionRecorded(PowerAssert.scala:37)
[info]     verify.asserts.RecorderRuntime.recordExpression(RecorderRuntime.scala:41)
[info]     org.pantsbuild.jarjar.KeepSpec$.$anonfun$new$3(KeepSpec.scala:22)
[info]     verify.BasicTestSuite.$anonfun$test$1(BasicTestSuite.scala:23)
[info]     verify.TestSpec$.$anonfun$sync$1(TestSpec.scala:48)
[info]     verify.TestSpec.apply(TestSpec.scala:22)
[info]     verify.Properties.$anonfun$iterator$2(Properties.scala:34)
[info]     verify.TestSpec.apply(TestSpec.scala:22)
[info]     verify.runner.Task.loop$1(Task.scala:51)
[info]     verify.runner.Task.$anonfun$execute$1(Task.scala:58)
[info]     scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:307)
[info]     scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:41)
[info]     scala.concurrent.impl.CallbackRunnable.run(Promise.scala:64)
[info]     java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
[info]     java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[info]     java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[info]     java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
[info]     java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175)
[error] Failed: Total 5, Failed 1, Errors 0, Passed 4
[error] Failed tests:
[error] 	org.pantsbuild.jarjar.KeepSpec
[error] (core / Test / test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 1 s, completed Aug 23, 2021 8:11:18 PM

Way to 'zap' files at the root?

Hi,

I'm trying to shade scala-xml.properties which is at the root, but it doesn't seem to be possible? Here's a snippet of the contents of the jar file, just for context:

META-INF/MANIFEST.MF
scala/
scala/xml/
scala-xml.properties
scala/xml/Atom.class
scala/xml/Atom.sjsir
scala/xml/Atom.tasty

Here's a little test case (in ZapProcessorTest) which fails:

  @Test
  public void testRootZap() throws IOException {
    Zap zap = new Zap();
    zap.setPattern("scala-xml.properties");

    ZapProcessor zapProcessor = new ZapProcessor(Collections.singletonList(zap));

    EntryStruct entryStruct = new EntryStruct();
    entryStruct.name = "scala-xml.properties";
    assertFalse(zapProcessor.process(entryStruct));
  }

(AFAICT the scala-xml.properties file doesn't seem to actually be used by anything, but I'd like to remove it from the shaded artifact just in case it is...)

Is it currently impossible to remove a file which is at the root of the jar?

Getting a NoSuchMethod error for org.pantsbuild.jarjar.* classes

So, I'm trying to use this plugin as a replacement for coursier's shading[0], but I'm getting NoSuchMethodError whan trying to run a 'package':

[error] (shadedCirceGeneric / Compile / jarjarPackageBinMappings) java.lang.NoSuchMethodError: org.pantsbuild.jarjar.JJProcessor.<init>(Lscala/collection/Seq;ZZLjava/lang/String;)V
[error] (shadedCirceGenericExtras / Compile / jarjarPackageBinMappings) java.lang.NoSuchMethodError: org.pantsbuild.jarjar.JJProcessor.<init>(Lscala/collection/Seq;ZZLjava/lang/String;)V
[error] (shadedCirceYaml / Compile / jarjarPackageBinMappings) java.lang.NoSuchMethodError: org.pantsbuild.jarjar.JJProcessor.<init>(Lscala/collection/Seq;ZZLjava/lang/String;)V
[error] (shadedCirceCore / Compile / jarjarPackageBinMappings) java.lang.NoSuchMethodError: org.pantsbuild.jarjar.JJProcessor.<init>(Lscala/collection/Seq;ZZLjava/lang/String;)V
[error] (shadedCirceGenericParser / Compile / jarjarPackageBinMappings) java.lang.NoSuchMethodError: org.pantsbuild.jarjar.JJProcessor.<init>(Lscala/collection/Seq;ZZLjava/lang/String;)V

(I have five shaded projects, one for each circe submodule I'm interested in using.)

I have followed the instructions on http://eed3si9n.com/jarjar-abrams and also looked at the sbt-test examples in this repository, but no luck.

Am I supposed to add a dependency on jarjar itself somewhere in my build, and if so where? (Presumably somewhere in project/ ?)

[0] Which I have gotten to work for SBT 1.2.8, but nothing beyond that.

Release 1.8.2

There are a couple of patches that are not yet part of any release. @eed3si9n can 1.8.2 be cut?

Empty "directories" remain in output jar after using `zap`

Looking for some guidance and input here. After using the zap rule to remove some unwanted packages from the output jar, I still see the directory tree above the zapped files/packages still exist in the output jar. For example, with the following rule:

"zap org.threeten.**"

I still see the following entries in the output jarfile (just directories & a properties file, but no classes):

org/threeten/
org/threeten/bp/
org/threeten/bp/TZDB.dat
org/threeten/bp/chrono/
org/threeten/bp/format/
org/threeten/bp/format/ChronologyText.properties
org/threeten/bp/jdk8/
org/threeten/bp/temporal/
org/threeten/bp/zone/

Was wondering what it would take to avoid emitting the "empty" directories in the output jar? I'm also happy to take a look if you can point me in the right direction in the code.

Run CLI on Shapeless

steps

scala_import(
  name = "jar",
  tags = ["maven_coordinates=com.chuusai:shapeless_2.12", "maven_coordinates_and_version=com.chuusai:shapeless_2.12:2.3.2"],
  jars = ["@jvm__com_chuusai__shapeless//:shapeless_2.12.jar"],
  deps = [],
  exports = ["@jvm__org_scala_lang__scala_library//:jar", "@jvm__org_typelevel__macro_compat//:jar"],
  srcjar = "@jvm__com_chuusai__shapeless//:shapeless_2.12-sources.jar",
)

Problem

We're seeing this on Jenkins:

13:54:23 2023-10-04 17:54:23 Syntax error: Malformed input or input contains unmappable characters: shapeless/$tilde$qmark$greater$?.class
13:54:23 2023-10-04 17:54:23 Exception in thread "main" java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: shapeless/$tilde$qmark$greater$?.class
13:54:23 2023-10-04 17:54:23 at sun.nio.fs.UnixPath.encode(UnixPath.java:145)
13:54:23 2023-10-04 17:54:23 at sun.nio.fs.UnixPath.<init>(UnixPath.java:69)
13:54:23 2023-10-04 17:54:23 at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:279)
13:54:23 2023-10-04 17:54:23 at java.nio.file.Path.resolve(Path.java:515)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Zip$.next$1(Zip.scala:167)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Zip$.extract(Zip.scala:188)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Zip$.$anonfun$unzipStream$1(Zip.scala:153)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Using.apply(Using.scala:22)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Zip$.unzipStream(Zip.scala:153)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Zip$.$anonfun$unzip$1(Zip.scala:24)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Using.apply(Using.scala:22)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Zip$.unzip(Zip.scala:24)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Shader$.shadeFile(Shader.scala:20)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Main.process(Main.scala:21)
13:54:23 2023-10-04 17:54:23 at java.lang.reflect.Method.invoke(Method.java:566)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjar.MainUtil.runMain(MainUtil.java:39)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Main$.main(Main.scala:27)
13:54:23 2023-10-04 17:54:23 at com.eed3si9n.jarjarabrams.Main.main(Main.scala)

Unable to `zap` non-`.class` files

👋 Hey, we're trying to use jarjar via https://github.com/bazeltools/bazel_jar_jar while migrating a build to Bazel from Gradle. The Gradle shadow plugin that we're trying to replace allows for the removal of any file type/extension as part of the jar shading process. It appears that the ZapProcessor only allows zaping .class files.

public boolean process(EntryStruct struct) throws IOException {
String name = struct.name;
if (name.endsWith(".class"))
return !zap(name.substring(0, name.length() - 6));
return true;
}

I was thinking of removing this constraint to zap, but wanted to see if there were any objections before going too far down that path.

Alternatively, are there other suggestions for how to handle this use-case? We're currently seeing .proto files & native libraries added to the shaded jar, but would like them excluded.

sbt-assembly v1.2.0: Facing java.lang.ArrayIndexOutOfBoundsException: Index 65536 out of bounds for length 132

Facing error when I include "org.apache.cassandra" % "cassandra-all" % "4.0.0" -

[error] java.lang.ArrayIndexOutOfBoundsException: Index 65536 out of bounds for length 132
[error] at org.objectweb.asm.ClassReader.readLabel(ClassReader.java:2679)
[error] at org.objectweb.asm.ClassReader.createLabel(ClassReader.java:2695)
[error] at org.objectweb.asm.ClassReader.readTypeAnnotations(ClassReader.java:2761)
[error] at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1937)
[error] at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1514)
[error] at org.objectweb.asm.ClassReader.accept(ClassReader.java:744)
[error] at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
[error] at com.eed3si9n.jarjar.ScalaSigProcessor.process(ScalaSigProcessor.scala:15)
[error] at com.eed3si9n.jarjar.util.JarProcessorChain.process(JarProcessorChain.java:38)
[error] at com.eed3si9n.jarjar.JJProcessor.process(JJProcessor.scala:108)
[error] at com.eed3si9n.jarjarabrams.Shader$.$anonfun$bytecodeShader$6(Shader.scala:75)
[error] at com.eed3si9n.jarjarabrams.Shader$.$anonfun$shadeDirectory$4(Shader.scala:21)
[error] at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:293)
[error] at scala.collection.Iterator.foreach(Iterator.scala:943)
[error] at scala.collection.Iterator.foreach$(Iterator.scala:943)
[error] at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
[error] at scala.collection.IterableLike.foreach(IterableLike.scala:74)
[error] at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
[error] at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
[error] at scala.collection.TraversableLike.flatMap(TraversableLike.scala:293)
[error] at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:290)
[error] at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108)
[error] at com.eed3si9n.jarjarabrams.Shader$.shadeDirectory(Shader.scala:17)
[error] at sbtassembly.Assembly$.$anonfun$assembleMappings$11(Assembly.scala:296)
[error] at scala.collection.parallel.AugmentedIterableIterator.map2combiner(RemainsIterator.scala:116)
[error] at scala.collection.parallel.AugmentedIterableIterator.map2combiner$(RemainsIterator.scala:113)
[error] at scala.collection.parallel.immutable.ParVector$ParVectorIterator.map2combiner(ParVector.scala:66)
[error] at scala.collection.parallel.ParIterableLike$Map.leaf(ParIterableLike.scala:1056)
[error] at scala.collection.parallel.Task.$anonfun$tryLeaf$1(Tasks.scala:53)
[error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] at scala.util.control.Breaks$$anon$1.catchBreak(Breaks.scala:67)
[error] at scala.collection.parallel.Task.tryLeaf(Tasks.scala:56)
[error] at scala.collection.parallel.Task.tryLeaf$(Tasks.scala:50)
[error] at scala.collection.parallel.ParIterableLike$Map.tryLeaf(ParIterableLike.scala:1053)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal(Tasks.scala:170)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal$(Tasks.scala:157)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.internal(Tasks.scala:440)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute(Tasks.scala:150)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute$(Tasks.scala:149)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:440)
[error] at java.base/java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
[error] at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
[error] at java.base/java.util.concurrent.ForkJoinPool.awaitJoin(ForkJoinPool.java:1708)
[error] at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:397)
[error] at java.base/java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:721)
[error] at scala.collection.parallel.ForkJoinTasks$WrappedTask.sync(Tasks.scala:379)
[error] at scala.collection.parallel.ForkJoinTasks$WrappedTask.sync$(Tasks.scala:379)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.sync(Tasks.scala:440)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal(Tasks.scala:174)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal$(Tasks.scala:157)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.internal(Tasks.scala:440)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute(Tasks.scala:150)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute$(Tasks.scala:149)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:440)
[error] at java.base/java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
[error] at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
[error] at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
[error] at java.base/java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:721)
[error] at scala.collection.parallel.ForkJoinTasks$WrappedTask.sync(Tasks.scala:379)
[error] at scala.collection.parallel.ForkJoinTasks$WrappedTask.sync$(Tasks.scala:379)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.sync(Tasks.scala:440)
[error] at scala.collection.parallel.ForkJoinTasks.executeAndWaitResult(Tasks.scala:423)
[error] at scala.collection.parallel.ForkJoinTasks.executeAndWaitResult$(Tasks.scala:416)
[error] at scala.collection.parallel.ForkJoinTaskSupport.executeAndWaitResult(TaskSupport.scala:60)
[error] at scala.collection.parallel.ExecutionContextTasks.executeAndWaitResult(Tasks.scala:555)
[error] at scala.collection.parallel.ExecutionContextTasks.executeAndWaitResult$(Tasks.scala:555)
[error] at scala.collection.parallel.ExecutionContextTaskSupport.executeAndWaitResult(TaskSupport.scala:84)
[error] at scala.collection.parallel.ParIterableLike$ResultMapping.leaf(ParIterableLike.scala:960)
[error] at scala.collection.parallel.Task.$anonfun$tryLeaf$1(Tasks.scala:53)
[error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] at scala.util.control.Breaks$$anon$1.catchBreak(Breaks.scala:67)
[error] at scala.collection.parallel.Task.tryLeaf(Tasks.scala:56)
[error] at scala.collection.parallel.Task.tryLeaf$(Tasks.scala:50)
[error] at scala.collection.parallel.ParIterableLike$ResultMapping.tryLeaf(ParIterableLike.scala:955)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute(Tasks.scala:153)
[error] at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute$(Tasks.scala:149)
[error] at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:440)
[error] at java.base/java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
[error] at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
[error] at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
[error] at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
[error] at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
[error] at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

Cannot shade traits containg fields

Shading traits that contain fields causes AbstractMethodError when tring to instantiate a class that extends it. Shading the following trait

package com.jarjar
trait ScalaTrait { val a = 1 }

and then extending it and instantiating the class surfaces the issue:

class ExtendedTrait extends shaded.com.jarjar.ScalaTrait
new ExtendedTrait

The ExtendedTrait class implements shaded$com$jarjar$ScalaTrait$_setter_$a_$eq(int) (name constructed from the symbols in the scala signature of ScalaTrait), but the abstract getter method name was not updated during shading in ScalaTrait, so com$jarjar$ScalaTrait$_setter_$a_$eq(int) remains unimplemented.

Error when shading package but not subpackage

Shading the following classes

package org.experimental
class Value(kind: org.experimental.Kinds.Kind)
object Kinds { class Kind {} }

with these rules

rule org.experimental.** @0
rule org.** shaded.@0

causes the following error when trying to instantiate the shaded Value class

[error] Symbol 'term shaded.org.experimental' is missing from the classpath.
[error] This symbol is required by 'value org.experimental.Value.kind'.
[error] Make sure that term experimental is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
[error] A full rebuild may help if 'Value.class' was compiled against an incompatible version of shaded.org.
[error] class Verify { new Value(new Kinds.Kind) }
[error]                    ^
[error] one error found

Keep rule does not keep dependencies

From help.txt

The keep rule marks all matched classes as "roots". If any keep rules are defined all classes which are not reachable from the roots via dependency analysis are discarded when writing the output jar. This is the last step in the process, after renaming and zapping.

KeepProcessor.java and Shader.scala have diverged from these semantics and now only keep the classes that match a keep rule.

The code to build the dependency graph and compute its transitive closure is still present but the way it is currently used it has no effect:

  • getExcludes computes the transitive closure but is called before the dependency graph is populated (by depend.put() in KeepProcessor.process() and KeepProcessor.map()), it always returns an empty set. The check here is redundant because excludes is empty, and also because:
  • KeepProcessor.process() now returns false when keep rules don't match, dropping classes even if they are dependencies (that was not the case in the original implementation).
  • JJProcessor.strip() is intended to perform another pass to remove all excluded classes (not seen in the transitive closure). That method still exists but is not called from Shader. (It was called in Main.process())

The path forward depends on what are the intended semantics. To me keeping dependencies in the jar seems more useful and robust, but I do not have an immediate need keep rules. Maybe they are only rarely used. Users who would like to perform dead code elimination could prefer another tool that can also do it at a finer grain than the class level.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.