问题
I have an Android Maven project and want to use Google Guice 3.0 in it.
There is a "No-AOP" version of Guice, which is compatible with Android.
How can I tell maven to use the "No-AOP" version of guice?
Update 1 (03.05.2013 10:46 MSK):
When I add the dependency on Google Guice, I get following exception during the build (mvn clean install
):
[INFO] UNEXPECTED TOP-LEVEL EXCEPTION:
[INFO] java.lang.IllegalArgumentException: already added: Lcom/google/inject/Abs
tractModule;
[INFO] at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:12
3)
[INFO] at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
[INFO] at com.android.dx.command.dexer.Main.processClass(Main.java:490)
[INFO] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
[INFO] at com.android.dx.command.dexer.Main.access$400(Main.java:67)
[INFO] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpen
er.java:245)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.j
ava:131)
[INFO] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java
:109)
[INFO] at com.android.dx.command.dexer.Main.processOne(Main.java:422)
[INFO] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
[INFO] at com.android.dx.command.dexer.Main.run(Main.java:209)
[INFO] at com.android.dx.command.dexer.Main.main(Main.java:174)
[INFO] at com.android.dx.command.Main.main(Main.java:91)
[INFO] 1 error; aborting
Here are my dependencies:
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>4.1.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
<classifier>no_aop</classifier>
</dependency>
<!-- Make sure this (robolectric dependency) is below the android dependencies -->
<dependency>
<groupId>com.pivotallabs</groupId>
<artifactId>robolectric</artifactId>
<version>1.0-RC4</version>
</dependency>
<dependency>
<groupId>org.achartengine</groupId>
<artifactId>achartengine</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert-core</artifactId>
<version>2.0M8</version>
</dependency>
<dependency>
<groupId>ru.altruix</groupId>
<artifactId>ccp-commons</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>ru.altruix</groupId>
<artifactId>commons</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.4</version>
</dependency>
</dependencies>
回答1:
You need to specify no_aop
as classifier like this:
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
<classifier>no_aop</classifier>
</dependency>
回答2:
If you also want to get rid of the aopalliance dependency, use this:
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
<classifier>no_aop</classifier>
<exclusions>
<exclusion>
<artifactId>aopalliance</artifactId>
<groupId>aopalliance</groupId>
</exclusion>
</exclusions>
</dependency>
回答3:
Google discourages Guice usage on Android because of reflection performance. The last no_aop version you can use is:
compile 'com.google.inject:guice:2.0-no_aop'
'com.google.inject:guice:3.0-no_aop'
is no longer in the maven repository, as well as 'com.google.inject:guice:4.1.0-no_aop'
.
'com.google.inject:guice:4.1.0
crashes on Android with:
com.google.common.util.concurrent.ExecutionError: java.lang.ExceptionInInitializerError
and
compile ('com.google.inject:guice:4.1.0') {
exclude group: 'aopalliance', module: 'aopalliance'
}
crashes with NoClassDefFoundError: org.aopalliance.intercept.MethodInterceptor
来源:https://stackoverflow.com/questions/16352798/how-to-configure-the-maven-dependency-for-guice-3-0-for-use-without-aop