我已经为我的内部使用写了一小组minilibraries.这是使用Maven构建的.这些库的目标是"常规"Java,GWT和Android.其中一些是用Java 8编写的,因为我没有打算在GWT或Android上运行它们,因此其他库是用旧的Java 6编写的,以支持这两个库.我有一个将我的libs完全迁移到Java 8的计划(在语言特性方面),我成功地在尚未发布的GWT 2.8.0上运行Java 8重写库.但是,我不能让Java 8重写的libs为Android应用程序编译.问题是,Retrolambda(retrolambda-maven-plugin插件)似乎只能处理当前的Maven模块类,并完全忽略依赖类.因此,android-maven-plugin打破目标应用程序构建:
[INFO] UNEXPECTED TOP-LEVEL EXCEPTION:
[INFO] com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
[INFO] at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
[INFO] at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
[INFO] at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
[INFO] at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
[INFO] at com.android.dx.command.dexer.Main.processClass(Main.java:665)
[INFO] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
[INFO] at com.android.dx.command.dexer.Main.access$600(Main.java:78)
[INFO] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
[INFO] at com.android.dx.command.dexer.Main.processOne(Main.java:596)
[INFO] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
[INFO] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
[INFO] at com.android.dx.command.dexer.Main.run(Main.java:230)
[INFO] at com.android.dx.command.dexer.Main.main(Main.java:199)
[INFO] at com.android.dx.command.Main.main(Main.java:103)
[INFO] ...while parsing foo/bar/FooBar.class …Run Code Online (Sandbox Code Playgroud) 背景:
我们有maven基于Java的项目,它以JRE 1.7为目标,但源代码使用lambdas,因此我们用它retrolambda来转换Java 8源代码Java 7.当我们需要stream,function.*,Optional等时,我们也使用StreamSupport backport库.
用法retrolambda包括将项目的源语言和目标语言级别配置为1.8.
如果对java8类或方法(比如不依赖一切工作正常java.util.stream.*,java.util.Optional或方法引入java8类似Collection.forEach).如果有这样的用法然后构建传递,但它在运行时失败,当在Java 8的JVM下运行时.
题:
我的目标是在存在此类依赖项的情况下使构建失败.有没有办法Java 8在构建时检测新类/方法的依赖?
我想到了两个可能的选择,但我不确定它们中的任何一个是否可行:
lint4j)规则.不确定是否可以使用检测对类/方法的依赖性lint有人可以解释一下,为什么这两个 lambda都可以用这里的方法引用替换?
在RxJava中,map()接受一个类型的参数Func1<T, R>,其注释声明它"表示具有一个参数的函数".因此我完全理解为什么valueOf(Object)在这里工作.但trim()需要任何参数都没有.
那么这是如何工作的呢?
Observable.just("")
.map(s -> String.valueOf(s)) //lambdas
.map(s -> s.trim()) //
.map(String::valueOf) //method references
.map(String::trim) //
.subscribe();
Run Code Online (Sandbox Code Playgroud) Android Studio不会在接口的静态方法中停止.
示例:请参阅项目Conductor(version )的Utils.javagetFilteredNotes接口中的方法:0.9.3
public interface Utils {
// some lines removed for readability
static List<Note> getFilteredNotes(AppState appState) {
List<Note> notes = appState.notes();
NotesFilter filter = appState.filter();
return filter(ConsPStack.from(notes), note ->
filter == NotesFilter.ALL
|| filter == NotesFilter.CHECKED && note.checked
|| filter == NotesFilter.UNCHECKED && !note.checked);
}
Run Code Online (Sandbox Code Playgroud)
当我将接口转换为类时,它工作:
public class Utils
Run Code Online (Sandbox Code Playgroud)
为什么断点不能在界面上工作?
更多细节:
2.2.2Nexus_6_API_25.avd
7.1.1x86minifyEnabled=false调试版本的设置没有帮助我正在尝试编译Android项目失败.错误消息是:
任务':mobile:_compileAppDebug'的执行失败.
java.lang.NoSuchMethodError:com.google.auto.common.MoreTypes.asTypeElements(Ljavax/lang/model/util/Types; Ljava/lang/Iterable;)Lcom/google/common/collect/ImmutableSet;
这是我的模块的gradle依赖项,其中我指定了许多库,包括google Auto:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':library')
compile 'com.google.dagger:dagger:2.0-SNAPSHOT'
provided 'com.google.auto.value:auto-value:1.0-rc1'
apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT'
provided 'org.glassfish:javax.annotation:10.0-b28'
compile 'com.jakewharton:butterknife:6.1.0'
compile 'com.f2prateek.dart:dart:1.1.0'
}
Run Code Online (Sandbox Code Playgroud)
当我查看依赖项时,我认为我只需要谷歌自动值,因为这是丢失方法所在的位置,但添加提供的并不能解决问题.
项目gradle文件包含retrolambda插件
dependencies {
classpath 'me.tatarka:gradle-retrolambda:2.5.0'
classpath 'com.android.tools.build:gradle:1.0.1'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
classpath 'io.fabric.tools:gradle:1.+'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我确定哪些依赖项导致编译错误?有趣的是,当我将gradle文件复制到一个空项目时,一切运行正常.
我的travis.yml文件:
language: android
jdk: oraclejdk8
android:
components:
- build-tools-22.0.1
- android-22
- extra-android-m2repository
script:
- gradle build connectedCheck
Run Code Online (Sandbox Code Playgroud)
app:compileRetrolambdaDebug错误消息期间失败Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 1.
可以在Travis CI上运行Retrolambda吗?
添加--debug参数后,我得到以下信息:
13:44:02.064 [INFO] [system.out] Error! Failed to transform some classes
13:44:02.073 [INFO] [system.out] java.lang.RuntimeException: java.lang.IllegalAccessException: no such method: cz.skaut.warehousemanager.fragment.ItemDetailFragment.lambda$onViewCreated$32(Bitmap)void/invokeSpecial
at net.orfjackal.retrolambda.lambdas.LambdaReifier.reifyLambdaClass(LambdaReifier.java:42)
at net.orfjackal.retrolambda.lambdas.BackportLambdaInvocations$InvokeDynamicInsnConverter.backportLambda(BackportLambdaInvocations.java:105)
at net.orfjackal.retrolambda.lambdas.BackportLambdaInvocations$InvokeDynamicInsnConverter.visitInvokeDynamicInsn(BackportLambdaInvocations.java:94)
at net.orfjackal.retrolambda.asm.ClassReader.readCode(ClassReader.java:1439)
at net.orfjackal.retrolambda.asm.ClassReader.readMethod(ClassReader.java:1017)
at net.orfjackal.retrolambda.asm.ClassReader.accept(ClassReader.java:693)
at net.orfjackal.retrolambda.asm.ClassReader.accept(ClassReader.java:506)
at net.orfjackal.retrolambda.Transformers.lambda$transform$4(Transformers.java:106)
at net.orfjackal.retrolambda.Transformers$$Lambda$2/1190900417.accept(Unknown Source)
at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:120)
at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:106)
at net.orfjackal.retrolambda.Transformers.backportClass(Transformers.java:46)
at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:72)
at net.orfjackal.retrolambda.Main.main(Main.java:26) …Run Code Online (Sandbox Code Playgroud) 一个Android项目,旧版Android Studio很不错.但在我更新IDE版本后,当我使用gradle构建项目时会发生异常.
这是问题所在:
错误:任务':jellyrefresh:compileReleaseJava'的执行失败.
使用java 5,6或7运行gradle时,必须使用属性retrolambda.jdk或环境变量JAVA8_HOME设置jdk8的路径
问题是,我的环境是Windows XP(我不想更新),所以我无法安装Java 8,因此无需告诉我这样做.但我仍然想使用Android Studio的最新版本.
那么这个例外的最合理解决方案是什么?
我目前正在其中一个应用程序中使用Android Gradle Experiment插件,并且希望能够使用retrolambda库。要求之一是指定一些compileOptions。在普通的android build插件中,这有效:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Run Code Online (Sandbox Code Playgroud)
对于新的实验性插件,我在model.android下添加了它:
model {
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,上述结果导致gradle同步错误:
Gradle 'ApkTestRunner' project refresh failed
Error:Cause: com.android.build.gradle.managed.AndroidConfig$Impl
Run Code Online (Sandbox Code Playgroud)
如何使用新的Android实验性Gradle插件设置sourceCompatibility和targetCompatibility?
谢谢。
android android-gradle-plugin retrolambda gradle-experimental
我正在使用RxJava和Retrofit的组合实现网络API,我使用Realm作为我的数据库.我得到了相当多的工作,但我想知道它是否是正确的方法和事件的流程.所以,这是RetrofitApiManager.
public class RetrofitApiManager {
private static final String BASE_URL = "***";
private final ShopApi shopApi;
public RetrofitApiManager(OkHttpClient okHttpClient) {
// GSON INITIALIZATION
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(BASE_URL)
.build();
shopApi = retrofit.create(ShopApi.class);
}
public Observable<RealmResults<Shop>> getShops() {
return shopApi.getShops()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(response -> {
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(realm1 ->
realm1.copyToRealmOrUpdate(response.shops));
realm.close();
})
.flatMap(response -> {
Realm realm = Realm.getDefaultInstance();
Observable<RealmResults<Shop>> results = realm.where(Shop.class)
.findAllAsync()
.asObservable()
.filter(RealmResults::isLoaded);
realm.close();
return results;
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是呼吁 …
retrolambda ×10
android ×8
java ×5
java-8 ×2
lambda ×2
maven ×2
rx-java ×2
breakpoints ×1
butterknife ×1
dagger-2 ×1
gradle ×1
lint ×1
realm ×1
retrofit ×1
travis-ci ×1