Как я могу использовать новый язык Xtend Eclipse в моем проекте Android? - PullRequest
17 голосов
/ 06 ноября 2011

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

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

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

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

Ответы [ 5 ]

11 голосов
/ 11 ноября 2011

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

Код действия HelloAndroid будет выглядеть так:

class XtendActivity extends Activity {

    override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R$layout::main);
    }
}
6 голосов
/ 07 ноября 2011

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

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

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

4 голосов
/ 06 ноября 2011

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

Сначала установите Xtend SDK в диспетчере обновлений Eclipse, введя «http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/", расширяющий узел« TMF Xtext-2.1.0 »и выбрав« Xtend2 SDK ». Подождите, затем перезапустите Eclipse.

В папке проекта Eclipse для Android отредактируйте файл ".project" (например, набрав "nano .project" в Terminal на 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.ide.eclipse.adt.ANDROID_FRAMEWORK, возможно, вам следует сделать это тоже.

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

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"

Выполните «Project» -> «Clean» для вашего проекта, и теперь вы можете создавать и использовать классы Xtend.

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

1 голос
/ 06 ноября 2011

Я пока не занимался разработкой для Android.Но код Xtend скомпилирован с использованием тонкой библиотеки времени выполнения (написанной на Java).В основном это всего три банки: - org.eclipse.xtext.xtend2.lib - org.eclipse.xtext.xbase.lib - com.google.collect

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

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

0 голосов
/ 16 октября 2012

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

Я создал (Java) Activity с помощью мастера, скопировал код, удалил Activity и создал вместо него файл 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;
  }

на данный момент не нравится активность_основы.

Мне потребовалось несколько минут, чтобы понять, что параметр "menu" переопределяет R.menu.activity_main. Как только я изменил параметр «menu» .xtend на «optionsMenu», он работал нормально.

...