{"id":267536,"date":"2015-11-05T13:06:04","date_gmt":"2015-11-05T10:06:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=267536"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=267536","title":{"rendered":"\u0423\u043b\u0438\u0447\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0438\u043b\u0438 \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 Groovy, Ivy \u0438 Maven?"},"content":{"rendered":"<p>       \u041f\u043e\u0441\u043b\u0435 \u043c\u0443\u0447\u0435\u043d\u0438\u0439 \u0441 \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 MVEL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 + MavenClassloader, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0435\u0441\u0442\u044c \u0432 \u044f\u0437\u044b\u043a\u0435 Groovy. \u0410 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0441\u043d\u044f \u2014 \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u0432 Idea \u0438 \u0432 Eclipse.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3f0\/ecd\/0db\/3f0ecd0dbafe402caa35b2a1a88ca7d3.jpg\"\/><\/p>\n<p>  \u0412\u044b \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439? \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u043f\u0440\u043e\u0449\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/268393\/\">\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u0432\u044b\u0436\u0438\u0432\u0430\u0435\u043c \u0432 JAR hell: \u043d\u0435 \u0434\u044b\u0448\u0438\u043c \u0441\u0435\u0440\u043e\u0439 \u0438 \u043d\u0435 \u0432\u0430\u0440\u0438\u043c\u0441\u044f \u0432 \u043a\u043e\u0442\u043b\u0435<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/267009\/\">\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u0432 Elasticsearch \u2014 \u0436\u0438\u0437\u043d\u044c \u0431\u0435\u0437 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0431\u0435\u0437 logstash<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/266781\/\">\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JDBC \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/265741\/\">\u0425\u0430\u0431\u0440 \u0448\u0435\u043b\u043b: \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u043e\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 ssh server \u0432 java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/264415\/\">\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0432\u0435\u0431 \u043a\u043e\u043d\u0441\u043e\u043b\u0435\u0439 \u0432 jvm \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 SonarQube<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/267223\/\">\u0414\u043e\u043a\u043b\u0430\u0434: \u00ab\u0410\u0441\u043f\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u043b\u044f java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 QA\u00bb<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/254571\/\">\u041d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e \u00ab\u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u00bb \u0434\u043b\u044f java \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u0442\u044c \u0433\u043e\u043b\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0438 \u0431\u044b\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <a href=\"http:\/\/docs.groovy-lang.org\/latest\/html\/documentation\/grape.html\">Grape<\/a>\u2026<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430:  <\/p>\n<pre><code class=\"java\">@Grapes([     @Grab(group='org.eclipse.jetty.aggregate', module='jetty-server', version='8.1.7.v20120910'),     @Grab(group='org.eclipse.jetty.aggregate', module='jetty-servlet', version='8.1.7.v20120910'),     @Grab(group='javax.servlet', module='javax.servlet-api', version='3.0.1')])  import org.eclipse.jetty.server.Server import org.eclipse.jetty.servlet.* import groovy.servlet.*  def runServer(duration) {     def server = new Server(8080)     def context = new ServletContextHandler(server, &quot;\/&quot;, ServletContextHandler.SESSIONS);     context.resourceBase = &quot;.&quot;     context.addServlet(TemplateServlet, &quot;*.gsp&quot;)     server.start()     sleep duration     server.stop() }  runServer(10000) <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438\u0437 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b jetty \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 classpath \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 http \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a gsp \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u0433\u0440\u0443\u0432\u0438), \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440, \u0436\u0434\u0435\u0442 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e. \u0422.\u0435. \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0443\u0436\u0435\u043d \u043b\u0438\u0448\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f\u043c \u0438 \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 jetty \u0443\u0436\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u043d\u0435 \u043d\u0430\u0434\u043e \u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0445 \u0438\u0437 \u0441\u0435\u0442\u0438.<\/p>\n<p>  \u041f\u043e \u043c\u043d\u0435 \u0442\u0430\u043a \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0430\u043c \u044f\u0437\u044b\u043a!!!<\/p>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0441 jetty \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043d\u0443\u0436\u0435\u043d \u043b\u0438\u0448\u044c groovy \u0438 \u043a\u043b\u0430\u0441\u0441\u044b ivy \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0432 classpath. \u041a\u043b\u0430\u0441\u0441\u044b \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438\u0437 maven \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ivy.<\/p>\n<p>  B \u0434\u0435\u0431\u0440\u044f\u0445 \u0433\u0440\u0443\u0432\u0438, \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0447\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 ${user.home}\/.groovy\/grapes, \u043f\u043e\u0442\u043e\u043c \u0432 ${user.home}\/.m2\/repository\/, \u043d\u0443 \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432 jcenter, \u043f\u043e\u0442\u043e\u043c \u0432 ibiblio, \u0430 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0432 java.net2 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f\u0445  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0422\u0430 \u0441\u0430\u043c\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;ivysettings&gt;   &lt;settings defaultResolver=&quot;downloadGrapes&quot;\/&gt;   &lt;resolvers&gt;     &lt;chain name=&quot;downloadGrapes&quot; returnFirst=&quot;true&quot;&gt;       &lt;filesystem name=&quot;cachedGrapes&quot;&gt;         &lt;ivy pattern=&quot;${user.home}\/.groovy\/grapes\/[organisation]\/[module]\/ivy-[revision].xml&quot;\/&gt;         &lt;artifact pattern=&quot;${user.home}\/.groovy\/grapes\/[organisation]\/[module]\/[type]s\/[artifact]-[revision](-[classifier]).[ext]&quot;\/&gt;       &lt;\/filesystem&gt;       &lt;ibiblio name=&quot;localm2&quot; root=&quot;file:${user.home}\/.m2\/repository\/&quot; checkmodified=&quot;true&quot; changingPattern=&quot;.*&quot; changingMatcher=&quot;regexp&quot; m2compatible=&quot;true&quot;\/&gt;       &lt;!-- todo add 'endorsed groovy extensions' resolver here --&gt;       &lt;ibiblio name=&quot;jcenter&quot; root=&quot;https:\/\/jcenter.bintray.com\/&quot; m2compatible=&quot;true&quot;\/&gt;       &lt;ibiblio name=&quot;ibiblio&quot; m2compatible=&quot;true&quot;\/&gt;       &lt;ibiblio name=&quot;java.net2&quot; root=&quot;http:\/\/download.java.net\/maven\/2\/&quot; m2compatible=&quot;true&quot;\/&gt;     &lt;\/chain&gt;   &lt;\/resolvers&gt; &lt;\/ivysettings&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e Grape \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 Ivy \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0432\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c jar \u0441 \u0433\u0440\u0443\u0432\u0438. \u0412\u043e\u0442 \u043f\u0440\u043e \u0447\u0442\u043e \u044f \u0433\u043e\u0432\u043e\u0440\u044e:  <\/p>\n<blockquote><p>igor@igor-comp:~\/dev\/projects\/groovy-grape-aether$ java -jar \/home\/igor\/.m2\/repository\/org\/codehaus\/groovy\/groovy-all\/2.4.5\/groovy-all-2.4.5.jar ~\/dev\/projects\/jetty.groovy <br \/>  Caught: java.lang.NoClassDefFoundError: org\/apache\/ivy\/Ivy<br \/>  java.lang.NoClassDefFoundError: org\/apache\/ivy\/Ivy<br \/>  Caused by: java.lang.ClassNotFoundException: org.apache.ivy.Ivy<\/p><\/blockquote>\n<p>  \u041d\u0435 \u043e\u0434\u043d\u0443 \u0448\u0438\u0448\u043a\u0443 \u043d\u0430\u0431\u0438\u0432\u0430\u043b\u0438 \u0438 \u0442\u0435, \u043a\u0442\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Ivy \u0441 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u0439 \u0438\u043b\u0438 snapshot \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0438\u0437 maven \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0435\u0432.<\/p>\n<p>  \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435 <a href=\"https:\/\/github.com\/apache\/incubator-groovy\/blob\/master\/src\/main\/groovy\/grape\/Grape.java\">Grape.java<\/a> \u043f\u0440\u043e\u0435\u043a\u0442\u0430 groovy \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438  <\/p>\n<pre><code class=\"java\">                \/\/ by default use GrapeIvy                 \/\/TODO META-INF\/services resolver?                 instance = (GrapeEngine) Class.forName(&quot;groovy.grape.GrapeIvy&quot;).newInstance(); <\/code><\/pre>\n<p>  \u041f\u043e\u0438\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u043b\u0438 \u043a \u043f\u0440\u043e\u043a\u0442\u0443 Spring boot, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Grape, \u043d\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 Aether \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 maven. <a href=\"http:\/\/www.eclipse.org\/aether\/\">Aether<\/a> \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f\u043c \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432. \u041e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 maven, nexus, m2eclipse. \u0412\u0440\u044f\u0434 \u043b\u0438 Ivy \u0441\u043c\u043e\u0436\u0435\u0442 \u0441 \u043d\u0435\u0439 \u043f\u043e\u0442\u044f\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043b\u0435 \u0431\u043e\u044f. \u0411\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c aether \u0432 grape!<\/p>\n<p>  <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/blob\/master\/spring-boot-cli\/src\/main\/java\/org\/springframework\/boot\/cli\/compiler\/grape\/GrapeEngineInstaller.java\">GrapeEngineInstaller<\/a> \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0442\u043e, \u043e \u0447\u0435\u043c \u0434\u0443\u043c\u0430\u043b\u0438 \u0430\u0432\u0442\u043e\u0440\u044b groovy \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0441\u0430\u043b\u0438 TODO \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u2014 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044e Grape.instance \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 AetherGrapeEngine \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043e\u0433\u043e \u0432 \u0433\u0440\u0443\u0432\u0438 GrapeIvy.  <\/p>\n<pre><code class=\"java\">public abstract class GrapeEngineInstaller {  \tpublic static void install(GrapeEngine engine) { \t\tsynchronized (Grape.class) { \t\t\ttry { \t\t\t\tField field = Grape.class.getDeclaredField(&quot;instance&quot;); \t\t\t\tfield.setAccessible(true); \t\t\t\tfield.set(null, engine); <\/code><\/pre>\n<p>  \u0418 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0447\u0442\u043e \u0432 boot \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u00ab\u0433\u0440\u044f\u0437\u043d\u044b\u0439 \u0445\u0430\u043a\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0444\u043b\u0435\u043a\u0448\u0435\u043d\u0430) \u041c\u044b\u0441\u043b\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0433\u0440\u0443\u0432\u0438 \u00abTODO META-INF\/services resolver?\u00bb \u0442\u043e\u0436\u0435 \u043d\u0435 \u043b\u0443\u0447\u0448\u0430\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440 \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u044e \u0432 OSGI \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u0447\u0430\u0441\u0442\u044c\u044f \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d AetherGrapeEngine \u0431\u0435\u0437 \u0432\u0441\u0435\u0433\u043e boot \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 spring, \u0434\u0430 \u0435\u0449\u0435 \u0438 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 Aether.<\/p>\n<p>  \u042d\u0442\u043e \u0438 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043c\u0435\u043d\u044f \u043a \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 spring boot \u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 AetherGrapeEngine \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <a href=\"https:\/\/github.com\/igor-suhorukov\/mvn-classloader\">mvn-classloader<\/a> \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <a href=\"http:\/\/central.maven.org\/maven2\/com\/github\/igor-suhorukov\/mvn-classloader\/1.1\/mvn-classloader-1.1.jar\">\u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442<\/a> \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u0441\u0435\u0433\u043e 3 \u041c\u0411. \u042d\u0442\u0438 3 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u0430, \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438 \u044f\u0437\u044b\u043a\u0443 \u0433\u0440\u0443\u0432\u0438 \u0438 \u043c\u043e\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 <a href=\"https:\/\/github.com\/igor-suhorukov\/aspectj-scripting\">AspectJ-Scripting<\/a>!<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f mvn-classloader \u0438 groovy-all \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 9,7 \u041c\u0411, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 groovy-all \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c Grape \u0432 \u0432\u0430\u0448\u0435\u043c Groovy \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 AetherGrapeEngine. <\/p>\n<p>  \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0438\u0437 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f <a href=\"http:\/\/central.maven.org\/maven2\/com\/github\/igor-suhorukov\/groovy-grape-aether\/2.4.5\/groovy-grape-aether-2.4.5.jar\">groovy-grape-aether-2.4.5.jar<\/a>. \u0421\u043e\u0431\u0440\u0430\u043d \u043e\u043d \u0431\u044b\u043b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"https:\/\/github.com\/igor-suhorukov\/groovy-grape-aether\">groovy-grape-aether<\/a>.<\/p>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c ssh \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0433\u0440\u0443\u0432\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 carash.groovy:  <\/p>\n<pre><code class=\"java\">@Grab(group='org.crashub', module='crash.connectors.ssh', version='1.3.1') import org.crsh.standalone.Bootstrap import org.crsh.vfs.FS.Builder import org.crsh.vfs.spi.url.ClassPathMountFactory  def classLoader = Bootstrap.getClassLoader();  def classpathDriver = new ClassPathMountFactory(classLoader); def cmdFS = new Builder().register(&quot;classpath&quot;, classpathDriver).mount(&quot;classpath:\/crash\/commands\/&quot;).build(); def confFS = new Builder().register(&quot;classpath&quot;, classpathDriver).mount(&quot;classpath:\/crash\/&quot;).build(); def bootstrap = new Bootstrap(classLoader, confFS, cmdFS);  def config = new java.util.Properties(); config.put(&quot;crash.ssh.port&quot;, &quot;2000&quot;); config.put(&quot;crash.ssh.auth_timeout&quot;, &quot;300000&quot;); config.put(&quot;crash.ssh.idle_timeout&quot;, &quot;300000&quot;); config.put(&quot;crash.auth&quot;, &quot;simple&quot;); config.put(&quot;crash.auth.simple.username&quot;, &quot;admin&quot;); config.put(&quot;crash.auth.simple.password&quot;, &quot;admin&quot;);  bootstrap.setConfig(config); bootstrap.bootstrap();  sleep 60000  bootstrap.shutdown(); <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <b>java -jar groovy-grape-aether-2.4.5.jar carash.groovy<\/b>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043a\u0430\u043a \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<blockquote><p>\u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property vfs.refresh_period=1 from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=SSHPlugin,interface=SSHPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=SSHInlinePlugin,interface=CommandPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=KeyAuthenticationPlugin,interface=KeyAuthenticationPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=CRaSHShellFactory,interface=ShellFactory]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=GroovyLanguageProxy,interface=Language]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=JavaLanguage,interface=Language]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=ScriptLanguage,interface=Language]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=JaasAuthenticationPlugin,interface=AuthenticationPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.ServiceLoaderDiscovery getPlugins<br \/>  INFO: Loaded plugin Plugin[type=SimpleAuthenticationPlugin,interface=AuthenticationPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property ssh.port=2000 from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property ssh.auth_timeout=300000 from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property ssh.idle_timeout=300000 from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property ssh.default_encoding=UTF-8 from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property auth=simple from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property auth.simple.username=admin from properties<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginLifeCycle configureProperty<br \/>  INFO: Configuring property auth.simple.password=admin from properties<br \/>  SLF4J: Failed to load class \u00aborg.slf4j.impl.StaticLoggerBinder\u00bb.<br \/>  SLF4J: Defaulting to no-operation (NOP) logger implementation<br \/>  SLF4J: See <a href=\"http:\/\/www.slf4j.org\/codes.html#StaticLoggerBinder\">www.slf4j.org\/codes.html#StaticLoggerBinder<\/a> for further details.<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=KeyAuthenticationPlugin,interface=KeyAuthenticationPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=JaasAuthenticationPlugin,interface=AuthenticationPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=SimpleAuthenticationPlugin,interface=AuthenticationPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.ssh.SSHPlugin init<br \/>  INFO: Booting SSHD<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=GroovyLanguageProxy,interface=Language]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=JavaLanguage,interface=Language]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=ScriptLanguage,interface=Language]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=CRaSHShellFactory,interface=ShellFactory]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.ssh.term.SSHLifeCycle init<br \/>  INFO: About to start CRaSSHD<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.ssh.term.SSHLifeCycle init<br \/>  INFO: CRaSSHD started on port 2000<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=SSHPlugin,interface=SSHPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:50 AM org.crsh.plugin.PluginManager getPlugins<br \/>  INFO: Initialized plugin Plugin[type=SSHInlinePlugin,interface=CommandPlugin]<br \/>  \u043d\u043e\u044f 05, 2015 1:01:56 AM org.crsh.ssh.SSHPlugin destroy<br \/>  INFO: Shutting down SSHD  <\/p><\/blockquote>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443: ssh admin@127.0.0.1 -p 2000<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/857\/2f4\/79e\/8572f479e1db410a99d1c084db5b0111.png\"\/>  <\/div>\n<\/div>\n<p>  \u0418\u0442\u0430\u043a, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 maven \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0435\u0432 \u0432 \u043d\u0430\u0448\u0438\u0445 groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0443\u0436\u0435\u043d groovy-all-2.4.5 \u043e\u0431\u044a\u0435\u0434\u0435\u043d\u0435\u043d\u043d\u044b\u0439 \u0441 AetherGrapeEngine \u0432 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0435  <\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;   &lt;groupId&gt;com.github.igor-suhorukov&lt;\/groupId&gt;   &lt;artifactId&gt;groovy-grape-aether&lt;\/artifactId&gt;   &lt;version&gt;2.4.5&lt;\/version&gt; &lt;\/dependency&gt; <\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0436\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432 com.github.igorsuhorukov.smreed.dropship.MavenClassLoader \u0434\u043b\u044f java \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Groovy \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438 \u0432 java \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c  <\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;   &lt;groupId&gt;com.github.igor-suhorukov&lt;\/groupId&gt;   &lt;artifactId&gt;mvn-classloader&lt;\/artifactId&gt;   &lt;version&gt;1.1&lt;\/version&gt; &lt;\/dependency&gt; <\/code><\/pre>\n<p>  \u041c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u0437\u0432\u0435\u0447\u044c \u0438\u0437 spring boot, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u0438 \u043e\u0431\u044a\u0435\u0434\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u0441 Aether \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0443 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u044f\u0437\u044b\u043a\u0430 MVEL \u043d\u0430 Groovy. \u0410 \u0432\u0430\u043c \u0436\u0435\u043b\u0430\u044e \u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 Grape \u0438 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430 Groovy.<\/p>\n<p>  \u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0447\u0442\u043e Groovy, Ivy \u0438 Maven \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430 \u0433\u0440\u0443\u0432\u0438 Grape \u2014 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0443\u0437\u043d\u0430\u043b\u0438 \u043a\u0430\u043a Grape \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/270145\/\"> http:\/\/habrahabr.ru\/post\/270145\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u041f\u043e\u0441\u043b\u0435 \u043c\u0443\u0447\u0435\u043d\u0438\u0439 \u0441 \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 MVEL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 + MavenClassloader, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0435\u0441\u0442\u044c \u0432 \u044f\u0437\u044b\u043a\u0435 Groovy. \u0410 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0441\u043d\u044f \u2014 \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u0432 Idea \u0438 \u0432 Eclipse.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3f0\/ecd\/0db\/3f0ecd0dbafe402caa35b2a1a88ca7d3.jpg\"\/><\/p>\n<p>  \u0412\u044b \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u0435 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439? \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u043f\u0440\u043e\u0449\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/268393\/\">\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u0432\u044b\u0436\u0438\u0432\u0430\u0435\u043c \u0432 JAR hell: \u043d\u0435 \u0434\u044b\u0448\u0438\u043c \u0441\u0435\u0440\u043e\u0439 \u0438 \u043d\u0435 \u0432\u0430\u0440\u0438\u043c\u0441\u044f \u0432 \u043a\u043e\u0442\u043b\u0435<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/267009\/\">\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u0432 Elasticsearch \u2014 \u0436\u0438\u0437\u043d\u044c \u0431\u0435\u0437 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0431\u0435\u0437 logstash<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/266781\/\">\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JDBC \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/265741\/\">\u0425\u0430\u0431\u0440 \u0448\u0435\u043b\u043b: \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u0440\u043e\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 ssh server \u0432 java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/264415\/\">\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0432\u0435\u0431 \u043a\u043e\u043d\u0441\u043e\u043b\u0435\u0439 \u0432 jvm \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 SonarQube<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/267223\/\">\u0414\u043e\u043a\u043b\u0430\u0434: \u00ab\u0410\u0441\u043f\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u043b\u044f java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 QA\u00bb<\/a><\/li>\n<li><a href=\"http:\/\/habrahabr.ru\/post\/254571\/\">\u041d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e \u00ab\u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u00bb \u0434\u043b\u044f java \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u0442\u044c \u0433\u043e\u043b\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u0438 \u0431\u044b\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <a href=\"http:\/\/docs.groovy-lang.org\/latest\/html\/documentation\/grape.html\">Grape<\/a>\u2026  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-267536","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/267536","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=267536"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/267536\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=267536"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=267536"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=267536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}