• <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)  編輯 收藏 引用

            精品久久人人爽天天玩人人妻| 亚洲一区精品伊人久久伊人| 亚洲国产一成人久久精品| 久久精品国产亚洲7777| 午夜福利91久久福利| 日产精品久久久久久久性色| 久久久九九有精品国产| 久久免费视频1| 色综合久久综精品| 久久久久免费精品国产| 国产精品久久久久久久久鸭| 国产伊人久久| 国产成人精品久久免费动漫| 婷婷久久综合| 精品国产乱码久久久久久浪潮 | 精品久久国产一区二区三区香蕉| 久久久WWW免费人成精品| 久久精品国产清高在天天线| 久久久91人妻无码精品蜜桃HD| 老色鬼久久亚洲AV综合| 久久综合鬼色88久久精品综合自在自线噜噜| 国产精品久久久亚洲| 国产精品一区二区久久精品涩爱| 99久久婷婷国产一区二区| 久久精品一本到99热免费| 亚洲午夜久久久久久久久久| 合区精品久久久中文字幕一区| 伊人久久大香线蕉精品| 99精品国产在热久久无毒不卡| 久久精品国产亚洲av麻豆蜜芽| 亚洲国产天堂久久久久久| 久久久久无码精品| 国产精品日韩欧美久久综合| 欧美综合天天夜夜久久| 久久这里只精品国产99热| 久久精品欧美日韩精品| 亚洲精品白浆高清久久久久久| 亚洲AV成人无码久久精品老人| 久久婷婷五月综合国产尤物app | AV无码久久久久不卡网站下载| 日产精品99久久久久久|