• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ++wythern++

            X presents Y for a better Z

            What is shade jar, and what is its purpose.

            https://stackoverflow.com/questions/13620281/what-is-the-maven-shade-plugin-used-for-and-why-would-you-want-to-relocate-java


            Uber JAR, in short, is a JAR containing everything.

            Normally in Maven, we rely on dependency management. An artifact contains only the classes/resources of itself. Maven will be responsible to find out all artifacts (JARs etc) that the project depending on when the project is built.

            An uber-jar is something that take all dependencies, and extract the content of the dependencies and put them with the classes/resources of the project itself, in one big JAR. By having such uber-jar, it is easy for execution, because you will need only one big JAR instead of tons of small JARs to run your app. It also ease distribution in some case.

            Just a side-note. Avoid using uber-jar as Maven dependency, as it is ruining the dependency resolution feature of Maven. Normally we create uber-jar only for the final artifact for actual deployment or for manual distribution, but not for putting to Maven repository.


            Update: I have just discovered I haven't answered one part of the question : "What's the point of renaming the packages of the dependencies?". Here is some brief updates and hopefully will help people having similar question.

            Creating uber-jar for ease of deployment is one use case of shade plugin. There are also other common use cases which involve package renaming.

            For example, I am developing Foo library, which depends on a specific version (e.g. 1.0) of Bar library. Assuming I cannot make use of other version of Bar lib (because API change, or other technical issues, etc). If I simply declare Bar:1.0 as Foo's dependency in Maven, it is possible to fall into a problem: A Qux project is depending on Foo, and also Bar:2.0 (and it cannot use Bar:1.0 because Qux needs to use new feature in Bar:2.0). Here is the dilemma: should Qux use Bar:1.0 (which Qux's code will not work) or Bar:2.0 (which Foo's code will not work)?

            In order to solve this problem, developer of Foo can choose to use shade plugin to rename its usage of Bar, so that all classes in Bar:1.0 jar are embedded in Foo jar, and the package of the embedded Bar classes is changed from com.bar to com.foo.bar. By doing so, Qux can safely depends on Bar:2.0 because now Foo is no longer depending on Bar, and it is using is own copy of "altered" Bar located in another package.

            posted on 2017-06-19 11:23 wythern 閱讀(278) 評論(0)  編輯 收藏 引用

            久久香蕉综合色一综合色88| 夜夜亚洲天天久久| 久久亚洲精品人成综合网| 久久精品国产精品亚洲精品| 精品久久久久国产免费| 久久人人爽人人爽人人片AV不 | 中文字幕热久久久久久久| 久久国产色AV免费观看| 久久久久国色AV免费观看| AV无码久久久久不卡蜜桃| 久久久久亚洲AV无码专区网站 | 国产精品18久久久久久vr| 伊人色综合九久久天天蜜桃| 99久久精品费精品国产 | 久久夜色精品国产噜噜亚洲AV| 一本久久a久久精品综合夜夜| 久久亚洲欧美国产精品| 午夜福利91久久福利| 国产激情久久久久影院老熟女免费| 无码人妻久久久一区二区三区| 麻豆国内精品久久久久久| 久久99亚洲综合精品首页| 久久精品国产99国产电影网 | 国产精品免费久久久久影院| 国产一级做a爰片久久毛片| 久久丫精品国产亚洲av不卡| 99久久综合国产精品免费| 久久午夜福利电影| 久久久国产精华液| 人妻无码久久精品| 三级韩国一区久久二区综合| 无码8090精品久久一区| 久久久久久噜噜精品免费直播| 国产福利电影一区二区三区,免费久久久久久久精 | 蜜臀久久99精品久久久久久| 久久夜色精品国产| 日韩人妻无码一区二区三区久久99| 亚洲精品美女久久久久99小说 | 久久高潮一级毛片免费| 亚洲AⅤ优女AV综合久久久| 一本色综合久久|