我想用Xtend语言编写Java类(仅仅因为它更简洁),并将它编译回Java类,我可以在Java项目中使用它们。就像coffeescript。我怎么能这样做?
我尝试创建一个Xtend文件,就像我对新类一样,但是我收到了这个错误:
在类路径中找不到必需的库包
'org.eclipse.xtext.xbase.lib'
。
这会禁用智能感知(自动完成)。另外,即使我确实能够正常工作,我怎样才能将它编译成Java类?
答案 0 :(得分:11)
在Xtend中,内部类使用美元符号('$')取消引用,静态成员使用双冒号('::')访问。
HelloAndroid活动代码如下所示:
class XtendActivity extends Activity {
override void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R$layout::main);
}
}
答案 1 :(得分:6)
尝试了同样的事情,我可以确认启用Xtend Nature并添加三个Xtend库(前面提到过'org.eclipse.xtext.xtend2.lib','org.eclipse.xtext.xbase.lib'和'com.google.inject')项目的库至少使编译Xtend代码。但是,我也遇到了R级的问题。
仔细观察,看起来R类的问题不在于它位于不同的目录中。使用其他名称将文件复制到主源目录不会更改任何内容。相反,看起来问题是R类是静态最终类,包含几个静态最终子类。如果我创建一个简单的普通Java包装类,它在普通方法中包含对R.layout.main(例如)的引用,并从我的Xtend代码调用它,那么它确实接受它并愉快地编译。
之后,我遇到的下一个问题是Android编译器在'org.eclipse.xtext.xtend2.lib','org.eclipse.xtext.xbase.lib中抱怨重复的about.html和plugin.properties文件'和'com.google.inject'。通过从三个.jar文件中的两个中删除这些文件,这相对容易修复。我不确定以后是否会破坏任何内容,但现在至少我在Android模拟器上运行了一段Xtend代码。
答案 2 :(得分:4)
我刚刚编译好了,虽然我现在无法导入“R”类。 执行以下步骤:
首先,在Eclipse更新管理器中安装Xtend SDK,输入“http://download.eclipse.org/modeling/tmf/xtext/updates/composite/releases/”,展开节点“TMF Xtext-2.1。 0“,然后选择”Xtend2 SDK“。等等,然后重启Eclipse。
在你的Eclipse Android项目文件夹中,编辑文件“.project”(例如在OSX上的终端中输入“nano .project”),并将其更改为类似于此(名称除外;你实际上可以复制整个内容并将名称更改回您的项目名称):
<?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"
执行“项目” - &gt;对项目进行“清理”,现在可以创建和使用Xtend类。
如前所述,我无法导入R类,也许Xtend只是在普通的“src”文件夹中查找类文件。
答案 3 :(得分:1)
到目前为止,我还没有做任何Android开发。但Xtend代码是针对瘦运行时库(用Java编写)编译的。它主要只是三个罐子: - org.eclipse.xtext.xtend2.lib - org.eclipse.xtext.xbase.lib - com.google.collect
它们都安装在eclipse中,因此您应该在安装的plugins文件夹中找到它们。我们通常使用OSGI和PDE将它们放在类路径上,但它实际上只是一个类路径依赖。
Xtend可以像Java一样导入类路径上的所有内容。它重用了Java项目配置以及Java开发工具。所以只要你在类路径上有“R”类就可以了。请在bugs.eclipse.org(在Modeling / TMF / Xtext下)提交bugzilla如果你不能引用它,尽管你可以从位于Xtend文件旁边的Java中引用它。并提供一个小例子和一些额外的解释。
答案 4 :(得分:0)
这是另一个问题:确保您的参数名称与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;
}
此时不喜欢activity_main。
我花了几分钟才发现“菜单”参数覆盖了R.menu.activity_main。 一旦我将.xtend的“menu”参数更改为“optionsMenu”,它就可以正常工作。