Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relocating scala classes #146

Open
jongwook opened this issue Jul 6, 2015 · 16 comments
Open

Relocating scala classes #146

jongwook opened this issue Jul 6, 2015 · 16 comments

Comments

@jongwook
Copy link

jongwook commented Jul 6, 2015

Relocating scala classes that contain some non-java features like package objects and trait compositions doesn't seem to work with Gradle shadow plugin.

Can it be considered as an enhancement to be included in the future?

@johnrengelman
Copy link
Collaborator

I don't have any Scala experience so I can't comment on this intelligently. Shadow uses the ASM library to do the class relocation. If some other support is necessary for Scala classes then I'd be happy to look at a pull request.

@jnadler
Copy link

jnadler commented Mar 11, 2016

We're seeing the same problem in a mixed Scala+Java project. Not sure why ASM would treat Scala classes differently. If I can get some time, I'll dig in and see if I can figure this out.

This plugin is the key part of what makes it possible for us to build Apache Spark fat jars - thanks John!

@dainkaplan
Copy link

Also seeing this issue with scala classes. This thread is pretty old... @jnadler or anyone else find a solution to this?

@asm0dey
Copy link

asm0dey commented Jun 11, 2020

  1. It still doesn't work
  2. Interesting facts
    2.1 We're shading org.json package
    2.2 We use it inside scala trait
    2.3 bytecode is being changed, but
    2.4 scalap shows old signatures which means it's stores somewhere inside scala-specific annotation (for example @ScalaSignature)
❯ scalap CatalogMetadataProvider
package org.jetbrains.ztools.spark
trait CatalogMetadataProvider extends scala.AnyRef {
  def listTables(dbName: scala.Predef.String): org.json.JSONArray
  def listFunctions(dbName: scala.Predef.String): org.json.JSONArray
  def listColumns(dbName: scala.Predef.String, tableName: scala.Predef.String): org.json.JSONArray
  def listDatabases: org.json.JSONArray
  def toJson: org.json.JSONObject
}

❯ javap CatalogMetadataProvider
Warning: File ./CatalogMetadataProvider.class does not contain class CatalogMetadataProvider
Compiled from "CatalogMetadataProvider.scala"
public interface org.jetbrains.ztools.spark.CatalogMetadataProvider {
  public abstract org.jetbrains.bigdataide.shaded.org.json.JSONArray listTables(java.lang.String);
  public abstract org.jetbrains.bigdataide.shaded.org.json.JSONArray listFunctions(java.lang.String);
  public abstract org.jetbrains.bigdataide.shaded.org.json.JSONArray listColumns(java.lang.String, java.lang.String);
  public abstract org.jetbrains.bigdataide.shaded.org.json.JSONArray listDatabases();
  public abstract org.jetbrains.bigdataide.shaded.org.json.JSONObject toJson();
}

@johnrengelman
Copy link
Collaborator

Looks like a problem with Maven Shade too: https://issues.apache.org/jira/browse/MSHADE-345

@asm0dey
Copy link

asm0dey commented Jun 12, 2020

Known to work in sbt-assembly tho: https://github.com/sbt/sbt-assembly#shading

@johnrengelman
Copy link
Collaborator

@asm0dey Yeah, but not natively through ASM. See
https://github.com/sbt/sbt-assembly/blob/db69ab53cdbf0bfb3cff07183355a74c6ce49f14/src/main/scala/sbtassembly/Shader.scala
https://github.com/sbt/sbt-assembly/blob/master/src/main/scala/org/pantsbuild/jarjar/JJProcessor.scala
There's a bunch of custom handling for processing Scala bytecode.
So, this isn't a bug, it's a new feature and would require someone to write all the processing/tracking logic for Scala bytecode to be processed.

Contributions welcome.

@KazankovMarch
Copy link

Workaround, worked in my case: use https://github.com/google/jarjar for relocating

// Kotlin DSL
val jarJar = task<JavaExec>("jarjar") {
    val finalJarFile = "$buildDir/libs/${project.name}-${rootProject.version}.jar"
    main = "-jar"
    args = listOf("path/to/jarjar.jar", "process", "path/to/relocating_rules.txt", finalJarFile, finalJarFile)
}
tasks.withType<ShadowJar> {
    //...//
    finalizedBy(jarJar)
}

@shawjef3
Copy link

I have a possible implementation for this. #756

@tribbloid
Copy link

hmm, this is interesting. So sbt works but both gradle & maven fails?

I encounter the same problem on scala 2.12.16 & gradle 7.4.2, when relocating json4s

@asm0dey
Copy link

asm0dey commented Oct 11, 2022 via email

@shawjef3
Copy link

This is not a feature of SBT or Gradle. It's a feature of the shadowing plugins. In principle there's no need to change build tools to relocate Scala classes.

@tribbloid
Copy link

This is not a feature of SBT or Gradle. It's a feature of the shadowing plugins. In principle there's no need to change build tools to relocate Scala classes.

Totally agree, our next patch should be able to introduce the correct behaviour of this feature.

For a minimalistic comparative test case, see https://stackoverflow.com/questions/73768130/within-the-ecosystem-of-java-scala-or-kotlin-is-there-a-reliable-way-to-repack/74061407#74061407

@tribbloid
Copy link

it is not fixed?

looks like sbt has to hang around for a while

@johnrengelman
Copy link
Collaborator

Sorry was thinking about closing stale issues, did that and then backed away from it.

Same message as above. If someone wants to contribute support…thiugh id probably want to consider adding that support as an additional library rather than in the core code.

@tribbloid
Copy link

I see ... I may need to set up a bounty for it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

8 participants