• <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 閱讀(267) 評論(0)  編輯 收藏 引用

            久久er热视频在这里精品| 婷婷久久五月天| 日本欧美久久久久免费播放网| 精品久久人人爽天天玩人人妻| 亚洲午夜精品久久久久久浪潮| 久久99国产精品久久| 青青青青久久精品国产h| 久久久噜噜噜久久| 久久国产精品成人片免费| 精品多毛少妇人妻AV免费久久 | 亚洲αv久久久噜噜噜噜噜| 久久久国产精品亚洲一区| 久久99精品九九九久久婷婷| 亚洲精品乱码久久久久久中文字幕 | 久久久久久午夜精品| 久久青草国产精品一区| 久久久久久国产精品美女| 国产999精品久久久久久| av色综合久久天堂av色综合在| 精品国产青草久久久久福利| 久久亚洲中文字幕精品有坂深雪| 久久人妻少妇嫩草AV无码蜜桃| 久久久国产精品亚洲一区| 伊人久久大香线蕉av一区| 欧美色综合久久久久久| 狠狠精品干练久久久无码中文字幕| 久久精品99久久香蕉国产色戒| 狠狠色综合网站久久久久久久高清| 精品国产综合区久久久久久| 久久精品国产男包| 久久国产精品成人片免费| 亚洲另类欧美综合久久图片区| 久久久久久免费一区二区三区| 久久精品黄AA片一区二区三区| 一本色道久久HEZYO无码| 国产精自产拍久久久久久蜜| 国产亚洲欧美精品久久久| 99久久国产综合精品成人影院| 久久夜色精品国产亚洲| 2021国内久久精品| 日韩乱码人妻无码中文字幕久久 |