简体   繁体   English

maven-shade-plugin 是否适用于 Scala 类?

[英]Does maven-shade-plugin work with scala classes?

I have a maven project with both Java and Scala components, but when I use maven-shade-plugin, it relocates package names for both Java and Scala files, but ONLY renames packages inside Java files, Scala files still contain the older package names, what am I missing?我有一个包含 Java 和 Scala 组件的 maven 项目,但是当我使用 maven-shade-plugin 时,它会重新定位 Java 和 Scala 文件的包名,但只重命名 Java 文件中的包,Scala 文件仍然包含旧的包名,我错过了什么?

               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-shade-plugin</artifactId>
               <version>3.2.1</version>
               <executions>
                   <execution>
                       <phase>package</phase>
                       <goals>
                           <goal>shade</goal>
                       </goals>
                       <configuration>
                           <!--<minimizeJar>true</minimizeJar>-->
                           <artifactSet>
                               <includes>
                                   <include>ml.dmlc:xgboost4j-spark</include>
                                   <include>ml.dmlc:xgboost4j</include>
                               </includes>
                           </artifactSet>
                           <filters>
                               <filter>
                                   <artifact>*:*</artifact>
                                   <excludes>
                                       <exclude>META-INF/*.SF</exclude>
                                       <exclude>META-INF/*.DSA</exclude>
                                       <exclude>META-INF/*.RSA</exclude>
                                   </excludes>
                               </filter>
                           </filters>
                           <relocations>
                               <relocation>
                                   <pattern>ml.dmlc.xgboost4j</pattern>
                                   <shadedPattern>ml.dmlc.xgboost4j.shaded</shadedPattern>
                               </relocation>
                           </relocations>
                           <transformers>
                           </transformers>
                       </configuration>
                   </execution>
               </executions>
           </plugin>```

Sadly, I believe that Maven is intended to have this functionality but, currently (Dec 2020), it does not.遗憾的是,我认为 Maven 旨在具有此功能,但目前(2020 年 12 月)还没有。

This can be seen with this bug ticket: https://issues.apache.org/jira/browse/MSHADE-345这可以通过此错误票证看出: https : //issues.apache.org/jira/browse/MSHADE-345

workaround解决方法

I have personally done a silly workaround for this.我个人为此做了一个愚蠢的解决方法。 I make a new empty mvn project that has the dependency:我创建了一个具有依赖项的新空 mvn 项目:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>28.0-jre</version>
</dependency>

And the plugin:和插件:

  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.1.1</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <relocations>
            <relocation>
              <pattern>com.google.</pattern>
              <shadedPattern>shader.com.google.</shadedPattern>
            </relocation>
          </relocations>
        </configuration>
      </execution>
    </executions>
  </plugin>

Then in the project with code that requires a low version of guava and a new version of guava, include the empty project as a dependency.然后在需要低版本guava和新版本guava的代码的项目中,包含空项目作为依赖。

    <dependency>
        <groupId>com.yoursite.yourwork</groupId>
        <artifactId>shader</artifactId>
        <version>0.0.1</version>
    </dependency>

Then in a .scala file you import the new (version 28) guava classes like this:然后在 .scala 文件中导入新的(版本 28)番石榴类,如下所示:

import shader.com.google.common.graph.Network

Why this works为什么这有效

Since the error only occurs in scala projects where you refer to your own class that uses the dependency, or as said in the question "Scala files still contain the older package names" , shading a project that does not refer to its own dependencies bypasses the bug.由于错误仅发生在您引用自己的使用依赖项的类的 Scala 项目中,或者如问题“Scala 文件仍然包含旧的包名称”中所述,对不引用其自身依赖项的项目进行着色会绕过漏洞。

Yes, it does.是的,它确实。 Choose any build version you want and import the library into your Scala project.选择您想要的任何构建版本并将库导入您的 Scala 项目。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM