Я хочу интегрировать в проект Android на Gradle следующие библиотеки:
- Ломбок
- Робо-привязка с AspectJ
- Кинжал
Чтобы использовать RoboBinding с инструментами AspectJ и Android 1.1.0, я скомпилировал модуль Aspectj с помощью этого исправить.
Все библиотеки используют некоторую обработку аннотаций во время компиляции. Я обнаружил, что Lombok несовместим с AspectJ. Я заметил, что обработчик аннотаций от RoboBinding использует apt, тогда как lombok работает только с предоставленным (Dagger работает с обоими).
Я нашел также Lombok и AspectJ workaurond для Maven, но я не знаю, можно ли это использовать и с Gradle (если да, я не знаю, как это сделать).
Без Lombok проект компилируется и работает. Можете ли вы помочь с интеграцией Lombok и AspectJ с Gradle?
Ошибка:
Note: Start RoboBinding annotations processing...
Note: Start RoboBinding annotations processing...
Note: Start RoboBinding annotations processing...
Note: Start RoboBinding annotations processing...
:app:compileDebugAspectJ
warning You aren't using a compiler supported by lombok, so lombok will not work and has been disabled.
Your processor is: org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchProcessingEnvImpl
Lombok supports: sun/apple javac 1.6, ECJ
error at model.setOutput(model.getInput());
D:\Projects\BinderExample\app\src\main\java\foo\binderexample\MainActivity.java:32:0::0 The method getInput() is undefined for the type BinderModel
Error:Note: Start RoboBinding annotations processing...
Note: Start RoboBinding annotations processing...
Note: Start RoboBinding annotations processing...
Note: Start RoboBinding annotations processing...
error at model.setOutput(model.getInput());
D:\Projects\BinderExample\app\src\main\foo\binderexample\MainActivity.java:32:0::0 The method getInput() is undefined for the type BinderModel
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:compileDebugAspectJ'.
> The method getInput() is undefined for the type BinderModel
Модуль:
@Module(injects = MainActivity.class)
public class BinderModule {
@Provides
@Singleton
BinderModel provideBinderModel() {
return new BinderModel();
}
}
Модель:
@Data
@PresentationModel
public class BinderModel implements HasPresentationModelChangeSupport {
private final PresentationModelChangeSupport changeSupport = new PresentationModelChangeSupport(this);
private String input;
private String output;
@Override
public PresentationModelChangeSupport getPresentationModelChangeSupport() {
return changeSupport;
}
}
Действия:
public class MainActivity extends Activity {
@Inject
BinderModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ObjectGraph.create(new BinderModule()).inject(this);
View view = Binders.inflateAndBind(this, R.layout.activity_main, model);
setContentView(view);
ButterKnife.inject(this);
}
@OnClick(R.id.button)
void onButtonClick() {
model.setOutput(model.getInput());
}
}
Макет:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://robobinding.org/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:inputType="text"
bind:text="${input}"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/button"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge"
bind:text="{output}"/>
</LinearLayout>
Скрипт Gradle:
buildscript {
repositories {
jcenter()
mavenLocal()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
classpath 'org.robobinding:aspectj-plugin:0.8.3-fix'
}
}
apply plugin: 'com.android.application'
apply plugin: 'org.robobinding.android-aspectj'
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "foo.binderexample"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.jakewharton:butterknife:6.1.0'
//dagger
compile 'com.squareup.dagger:dagger:1.2.2'
apt 'com.squareup.dagger:dagger-compiler:1.2.2'
//lombok
provided 'org.projectlombok:lombok:1.16.2'
apt 'org.projectlombok:lombok:1.16.2'
//robobinding
compile('org.robobinding:robobinding:0.8.9:with-aop-and-dependencies') {
exclude group: 'com.google.guava', module: 'guava'
}
aspectPath('org.robobinding:robobinding:0.8.9:with-aop-and-dependencies') {
exclude group: 'com.google.guava', module: 'guava'
}
apt 'org.robobinding:codegen:0.8.9'
}