Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Plugin for Eclipse Luna?

I have installed Eclipse Luna 4.4-M6. I tried installing the Google Plugin for Eclipse 4.3 (Kepler), but Eclipse would not allow me to install it.

Is there some way to force it to install (e.g. by downloading it and editing some manifest or other)? Or would this be futile due to breaking changes between 4.3 and 4.4?

like image 551
ᴇʟᴇvᴀтᴇ Avatar asked Apr 16 '14 20:04

ᴇʟᴇvᴀтᴇ


3 Answers

According to the Google Plugin for Eclipse community forum, we might be able to expect a new plugin with Luna support by mid-July.

https://groups.google.com/forum/#!topic/google-plugin-eclipse/4YACQROrB2U

like image 160
Jim McCabe Avatar answered Oct 05 '22 01:10

Jim McCabe


It turns out there is a way to alter the manifests to allow the Google Plugin for Kepler to install in Eclipse Luna. Contributor Ze Kritter on Google Groups has written an Apache Ant build.xml file that performs the necessary work, original here and reproduced below.

It worked beautifully for me. I have successfully run this script and installed the plugin into Luna, and - at least for GWT - it seems to work as usual.

According to the discussion thread on Google Groups there are some incompatibilities with the Maven plugin (I personally don't use Maven) and a new and suitably well-tested Google plugin will be coming out shortly (late July 2014).

<?xml version="1.0" encoding="UTF-8"?>

<project name="gpe.4.luna" basedir="." default="update.end">
    <property environment="env"/>

    <property name="project.base.dir" value="."/>
    <property name="project.temp.dir" value="${project.base.dir}/temp"/>
    <property name="project.plugin.dir" value="${project.base.dir}/plugin"/>
    <property name="project.plugins.dir" value="${project.plugin.dir}/plugins"/>
    <property name="e42.plugin.jar" value="${project.plugins.dir}/com.google.gdt.eclipse.platform.e42_3.6.0.v201406262229-rel-r43.jar"/>
    <property name="artifacts.jar" value="${project.plugin.dir}/artifacts.jar"/>
    <property name="content.jar" value="${project.plugin.dir}/content.jar"/>

    <property name="plugin43.zip" value="com.google.gdt.eclipse.suite.4.3.update.site_3.6.0.zip"/>
    <property name="plugin44.zip" value="com.google.gdt.eclipse.suite.4.4.update.site_3.6.0.zip"/>

    <!--
        source: http://stackoverflow.com/a/5340557/3747097
        Loads entries from a manifest file.

        @jar     The jar from where to read
        @file    A manifest file to read
        @prefix  A prefix to prepend
        @section The name of the manifest section to load
    -->
    <scriptdef name="loadManifest" language="javascript" loaderRef="sharedbuild-loaderRef">
        <attribute name="jar" />
        <attribute name="file" />
        <attribute name="prefix" />
        <attribute name="section" />
        <![CDATA[
            var jarname = attributes.get("jar");
            var filename = attributes.get("file");
            if (jarname != null && filename != null) {
                self.fail("Only one of jar or file is required");
            }
            var prefix = attributes.get("prefix");
            if (prefix == null) {
                prefix = "";
            }
            var section = attributes.get("section");

            var manifest;
            if (jarname != null) {
                var jarfile = new java.util.jar.JarFile(new java.io.File(jarname));
                manifest = jarfile.getManifest();
            } else if (filename != null) {
                manifest = new java.util.jar.Manifest(new java.io.FileInputStream(new java.io.File(filename)));
            } else {
                self.fail("One of jar or file is required");
            }

            if (manifest == null) {
                self.log("No manifest in " + jar);
            } else {
                var attributes = (section == null) ? manifest.getMainAttributes() : manifest.getAttributes(section);
                if (attributes != null) {
                    var iter = attributes.entrySet().iterator();
                    while (iter.hasNext()) {
                        var entry = iter.next();
                        // self.log("key " + entry.getKey());
                        // self.log("value " + entry.getValue());
                        project.setProperty(prefix + entry.getKey(), entry.getValue());
                    }
                }
            }
        ]]>
    </scriptdef>

    <!--
        source: http://giorgio-ferrara.blogspot.ru/2010/09/apache-ant-how-to-search-and-replace.html
    -->
    <macrodef name="replaceStringWithRegExp">
        <attribute name="string"/>
        <attribute name="searchPattern"/>
        <attribute name="replacementPattern"/>
        <attribute name="property"/>
        <sequential>
            <tokens id="id">
                <concat>
                <string value="@{string}"/>
                <filterchain>
                    <tokenfilter>
                        <replaceregex pattern="@{searchPattern}"
                                    replace="@{replacementPattern}"
                                    flags="g"/>
                    </tokenfilter>
                </filterchain>
                </concat>
            </tokens>
            <property name="@{property}" value="${toString:id}"/>
        </sequential>
    </macrodef>

    <target name="clean">
        <delete dir="${project.temp.dir}"/>
        <delete dir="${project.plugin.dir}"/>
        <delete file="${plugin44.zip}"/>
    </target>

    <target depends="clean" name="init">
        <mkdir dir="${project.temp.dir}"/>
    </target>

    <target depends="init" name="check.source">
        <condition property="plugin-not-found">
            <not>
                <available file="${plugin43.zip}"/>
            </not>
        </condition>
    </target>

    <target depends="check.source" name="get.source" if="${plugin-not-found}">
        <get src="https://commondatastorage.googleapis.com/eclipse_toolreleases/products/gpe/release/3.6.0/4.3/com.google.gdt.eclipse.suite.4.3.update.site_3.6.0.zip" dest="."/>
    </target>

    <target depends="check.source, get.source" name="unzip.source">
        <unzip src="${plugin43.zip}" dest="${project.plugin.dir}"/>
    </target>

    <target depends="unzip.source" name="update.manifest">
        <checksum file="${e42.plugin.jar}" property="original.md5"/>
        <loadManifest jar="${e42.plugin.jar}" prefix="e42.mf."/>
        <replaceStringWithRegExp string="${e42.mf.Require-Bundle}"
            searchPattern="(.*);bundle-version=&quot;\[3.8.0,3.10.0\)&quot;(.*)"
            replacementPattern="\1\2"
            property="Require-Bundle"/>
        <!--
        <echo>${e42.mf.Require-Bundle}</echo>
        <echo>${Require-Bundle}</echo>
        -->
        <jar update="true" file="${e42.plugin.jar}">
            <manifest>
                <attribute name="Require-Bundle" value="${Require-Bundle}"/>
            </manifest>
        </jar>
        <checksum file="${e42.plugin.jar}" property="updated.md5"/>
        <!--
        <echo>${original.md5}</echo>
        <echo>${updated.md5}</echo>
        -->
    </target>

    <target depends="update.manifest" name="update.artifacts">
        <delete includeemptydirs="true">
            <fileset dir="${project.temp.dir}" includes="**/*"/>
        </delete>
        <unzip src="${artifacts.jar}" dest="${project.temp.dir}"/>
        <replaceregexp byline="true">
            <regexp pattern="${original.md5}"/>
            <substitution expression="${updated.md5}"/>
            <fileset dir="${project.temp.dir}"/>
        </replaceregexp>
        <zip destfile="${artifacts.jar}" basedir="${project.temp.dir}"/>
    </target>

    <target depends="update.artifacts" name="update.content">
        <delete includeemptydirs="true">
            <fileset dir="${project.temp.dir}" includes="**/*"/>
        </delete>
        <unzip src="${content.jar}" dest="${project.temp.dir}"/>
        <replaceregexp byline="true">
            <regexp pattern="name='org.eclipse.core.runtime' range='\[3.8.0,3.10.0\)'"/>
            <substitution expression="name='org.eclipse.core.runtime' range='0.0.0'"/>
            <fileset dir="${project.temp.dir}"/>
        </replaceregexp>
        <zip destfile="${content.jar}" basedir="${project.temp.dir}"/>
    </target>

    <target depends="update.content" name="create.updated.plugin">
        <zip destfile="${plugin44.zip}" basedir="${project.plugin.dir}"/>
        <delete dir="${project.temp.dir}"/>
        <delete dir="${project.plugin.dir}"/>
    </target>

    <target depends="create.updated.plugin" name="update.end">
        <echo message="plugin rebuild success"/>
    </target>

</project>

I'll add the words Eclipse Mars here, so this solution can be found by searching and potentially adapted for the June 2015 release of Eclipse.

like image 32
ᴇʟᴇvᴀтᴇ Avatar answered Oct 05 '22 01:10

ᴇʟᴇvᴀтᴇ


This seems to be recently resolved.

I didn't find the plugin in the Marketplace as of writing this, but there's an update site: https://dl.google.com/eclipse/plugin/4.4

You can read more about this at https://developers.google.com/eclipse/docs/install-eclipse-4.4

like image 38
Henrik Paul Avatar answered Oct 04 '22 23:10

Henrik Paul