Как я могу использовать новый язык Xtend Eclipse в моем проекте Android?

Я хотел бы написать классы Java на языке Xtend (просто потому, что его путь более лаконичен) и скомпилировать его обратно в классы Java, которые я могу использовать в своем проекте Java. Просто как в CoffeeScript. Как я могу это сделать?

Я попытался создать файл Xtend так же, как и с новым классом, однако я получаю эту ошибку:

обязательный библиотечный комплект 'org.eclipse.xtext.xbase.lib' не нашли в classpath.

это отключает intellisense (автозавершение.) Кроме того, даже если я получу эту работу, как я могу скомпилировать ее в класс Java?

5 ответов


попробовав то же самое, я могу подтвердить, что включение природы Xtend и добавление трех библиотек Xtend (упомянутых ранее, " org.затмение.xtext.xtend2.lib', ' org.затмение.xtext.пакете xbase.lib ' и ' com.гуглить.inject') в библиотеки проекта, по крайней мере, компилирует код Xtend. Однако у меня также возникают проблемы с классом R.

при ближайшем рассмотрении похоже, что проблема с классом R не в том, что он находится в другом каталоге. Копирование файл в основной исходный каталог с другим именем ничего не меняет. Скорее, похоже, проблема заключается в том, что класс R является статические заключительные класса, содержащие несколько статические заключительные подклассы. Если я создам простой класс-оболочку Java, который обертывает ссылку на R. layout.main (например) внутри обычного метода и вызовите это из моего кода Xtend, затем он примет его и с удовольствием компилирует.

после этого следующий вопрос, с которым я столкнулся, был компилятор Android жалуется на дубликат о.HTML и плагин.свойства файлов в орг.затмение.xtext.xtend2.lib', ' org.затмение.xtext.пакете xbase.lib ' и ' com.гуглить.впрыснуть'. Это относительно легко исправить, удалив эти файлы из двух из трех .файл jar. Я не уверен, что это сломает что-нибудь позже, но теперь, по крайней мере, у меня есть рабочий фрагмент кода Xtend, работающий на эмуляторе Android.


в Xtend внутренние классы разыменованы с помощью знака доллара ( ' $ ' ), а статические члены доступны с помощью двойного двоеточия ('::').

код активности HelloAndroid будет выглядеть следующим образом:

class XtendActivity extends Activity {

    override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R$layout::main);
    }
}

Я только что получил его для компиляции, хотя пока не могу импортировать класс "R". Выполните следующие действия:

во-первых, установите Xtend SDK в Eclipse update manager, введя "http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/", развернув узел " TMF Xtext-2.1.0 "и выбрав"XTEND2 SDK". Подождите, затем перезапустите Eclipse.

В папке проекта Eclipse Android, отредактируйте файл ".проект "(например, набрав " nano .проект" в терминале на OSX), и измените его так, чтобы он напоминал это (за исключением имени; вы можете фактически скопировать весь контент и изменить имя обратно на имя вашего проекта):

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>TestAndroidXtend</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
    <buildCommand>
        <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.jdt.core.javabuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>com.android.ide.eclipse.adt.ApkBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
</buildSpec>
<natures>
    <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
    <nature>org.eclipse.jdt.core.javanature</nature>
    <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
</natures>

затем вставьте в файл следующее ".classpath", в элементе classpath:

<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

Я поставил его перед записью с com.андроид.интегрированная среда разработки.затмение.АТД.ANDROID_FRAMEWORK, возможно, Вам тоже стоит это сделать.

назад в Eclipse, обновите проект с помощью F5, затем создайте папку "META-INF "на верхнем уровне проекта и создайте пустой файл "MANIFEST".МФ." Вставьте в него это содержимое:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Xtend Tutorial
Bundle-SymbolicName: xtend.tutorial
Bundle-Version: 2.1.0.qualifier
Bundle-Vendor: Eclipse Modeling
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.xtext.xtend2.lib;bundle-version="2.0.0",
 org.junit4,
 org.aopalliance;bundle-version="1.0.0"

выполните "проект" - > "очистить" в своем проекте, и теперь вы можете создавать и использовать классы Xtend.

как упоминалось ранее, я не могу импортировать класс R, возможно, Xtend просто смотрит в обычную папку "src" для файлов классов.


до сих пор я не занимался разработкой Android. Но код Xtend компилируется против тонкой библиотеки времени выполнения (написанной на Java). Это в основном просто три банки: - орг.затмение.xtext.xtend2.движение за освобождение - орг.затмение.xtext.пакете xbase.движение за освобождение - com.гуглить.собирать

Они все установлены в eclipse, поэтому вы должны найти их в папке плагинов вашей установки. Мы обычно используем OSGI и PDE, чтобы иметь их на пути к классам, но это действительно просто зависимость пути к классам.

Xtend может импортируйте все, что находится на пути к классам, как Java. Он повторно использует конфигурацию проекта Java, а также инструменты разработки Java. Так что, пока у вас есть класс " R " на пути к классу, он должен работать. Пожалуйста, подайте bugzilla на bugs.eclipse.org (под Modeling/TMF / Xtext), если вы не можете ссылаться на него, хотя вы можете из Java, который находится рядом с файлом Xtend. Приведите небольшой пример и некоторые дополнительные объяснения.


вот еще один gotcha: убедитесь, что ваши имена параметров не конфликтуют ни с чем в R.java - ...

Я создал (Java) действие с помощью мастера, скопировал код, удалил действие и создал MainActivity.xtend на своем месте, вроде так:


public class MainActivity extends Activity {

    override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R$layout::activity_main);
    }

    override boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R$menu::activity_main, menu);
        return true;
    }

это выглядит нормально .xtend файл, но он не строится, потому что сгенерированный Java-код

  public boolean onCreateOptionsMenu(final Menu menu) {
    MenuInflater _menuInflater = this.getMenuInflater();
    _menuInflater.inflate(menu.activity_main, menu);
    return true;
  }

не нравится activity_main на данный момент.

мне понадобилось несколько минут, чтобы понять из-за того, что параметр" menu " переопределял R. menu.activity_main. Однажды я изменил .параметр "меню" xtend для "optionsMenu", он работал нормально.