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

            99久久综合国产精品免费| 久久精品国产精品国产精品污| 日韩欧美亚洲综合久久影院Ds| 日韩人妻无码一区二区三区久久99| 无码久久精品国产亚洲Av影片| 色综合久久最新中文字幕| 亚洲国产精品成人AV无码久久综合影院 | 成人资源影音先锋久久资源网| 久久e热在这里只有国产中文精品99| 亚洲精品tv久久久久| 91精品国产高清久久久久久91 | 久久久久久A亚洲欧洲AV冫| 久久婷婷国产综合精品| 亚洲精品成人网久久久久久| 久久最新精品国产| 久久久久免费看成人影片| 亚洲另类欧美综合久久图片区| 丰满少妇人妻久久久久久4| 久久精品国产亚洲AV电影 | 国产亚洲精久久久久久无码77777| 国产精品久久久久久| 亚洲精品乱码久久久久久自慰| 欧洲国产伦久久久久久久| 久久高清一级毛片| 久久国产精品无码网站| 天天综合久久久网| 久久精品免费观看| .精品久久久麻豆国产精品| 人妻少妇久久中文字幕一区二区| 亚洲va久久久久| 久久国产精品无| 亚洲&#228;v永久无码精品天堂久久 | 亚洲人成网站999久久久综合| 久久久久久青草大香综合精品| 国产精品99久久久久久宅男| 国产精品嫩草影院久久| 久久九九久精品国产免费直播| 久久综合给合综合久久| 香蕉久久夜色精品国产尤物| 欧美日韩精品久久久久| 熟妇人妻久久中文字幕|