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

            久久夜色撩人精品国产| 久久精品国产99久久久香蕉 | 伊人久久大香线蕉亚洲| 看全色黄大色大片免费久久久| 国产精品综合久久第一页 | 亚洲AV成人无码久久精品老人| 精品久久久久久无码不卡| 久久无码AV一区二区三区| 久久精品国产第一区二区三区| 国产精品一区二区久久精品无码 | 久久天天躁狠狠躁夜夜躁2014| 久久久久波多野结衣高潮| 国产精品一久久香蕉国产线看观看| 国产一区二区三区久久| 久久午夜无码鲁丝片秋霞| 日本久久久久久中文字幕| 亚洲日本va中文字幕久久| 久久99国产精品成人欧美| 日产精品久久久久久久性色 | 亚洲AV乱码久久精品蜜桃| 久久久久综合国产欧美一区二区| 亚洲精品蜜桃久久久久久| 久久国产乱子伦精品免费午夜| 综合网日日天干夜夜久久| 久久97久久97精品免视看| 久久99国产精品久久久| 国产情侣久久久久aⅴ免费| 久久99九九国产免费看小说| 97久久精品人人澡人人爽| 久久r热这里有精品视频| 亚洲AV无一区二区三区久久| 日日狠狠久久偷偷色综合免费 | 久久91精品国产91| 伊人久久大香线蕉精品不卡| 精品一久久香蕉国产线看播放| 伊人色综合久久天天| 国产精品久久一区二区三区| 久久亚洲精品国产精品| 久久久久女人精品毛片| 久久亚洲春色中文字幕久久久| 国产精品99久久久久久宅男小说|