Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes bug #421 - Run Testerra as part of fat jar standalone application #422

Merged

Conversation

erickubenka
Copy link
Contributor

Description

Fixes bug #421 by apply a package filter to avoid implementations of com.google.inject.AbstractModule that does not fullfill package class will be instantiated.

Concrete class of the fat jar that will force this error is com.google.inject.util.Modules$OverrideModule.

Before this fix Testerra tried to invoke the following implementations of AbstractModule inside the fat jar:

  • Loading module: eu.tsystems.mms.tic.testframework.hook.ReportModelHook
  • Loading module: eu.tsystems.mms.tic.testframework.hook.ReportNgHook
  • Loading module: com.google.inject.util.Modules$OverrideModule
  • Loading module: eu.tsystems.mms.tic.testframework.ioc.CoreHook
  • Loading module: com.google.inject.internal.RealMultibinder$PermitDuplicatesModule
  • Loading module: eu.tsystems.mms.tic.testframework.hooks.DriverUiHook
  • Loading module: eu.tsystems.mms.tic.testframework.ioc.DriverUi_Desktop
  • Loading module: com.google.inject.assistedinject.FactoryProvider2$2
  • Loading module: com.google.inject.assistedinject.FactoryModuleBuilder$1
  • Loading module: com.google.inject.util.Modules$2

After this fix Testerra tried to invoke the following implemenation like intended:

  • Loading module: eu.tsystems.mms.tic.testframework.hook.ReportModelHook
  • Loading module: eu.tsystems.mms.tic.testframework.hook.ReportNgHook
  • Loading module: eu.tsystems.mms.tic.testframework.ioc.CoreHook
  • Loading module: eu.tsystems.mms.tic.testframework.hooks.DriverUiHook
  • Loading module: eu.tsystems.mms.tic.testframework.ioc.DriverUi_Desktop

Fixes #421

Type of change

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

…ons of AbstractModule that does not fullfill package class will be instantiated.
@erickubenka erickubenka changed the title Fixes bug #421 Fixes bug #421 - Run Testerra as part of fat jar standalone application Apr 25, 2024
@martingrossmann
Copy link
Contributor

Hi @erickubenka, thanks for your fix! But can you explain why new ConfigurationBuilder().forPackages(...) does not filter in a JAR context?

@erickubenka
Copy link
Contributor Author

erickubenka commented Apr 25, 2024

Hey @martingrossmann,

to be honest, I don't get it either. When debugging the Main class with IntelliJ and investigating the scanned classes everything looks good, but in a built fat jar somehow it seems not be working as intented without that additional filter. May something is different then in how classes are loaded or the ClassLoader is built in general.

So, i just don't get it and had spent a lot hours the past days to find out if I was doing something wrong when packaging the jar. But as it happens with default skeleton project as well, I just tried to find out how I can fix it.

@martingrossmann martingrossmann added this to the 2.8 milestone Apr 25, 2024
@martingrossmann martingrossmann merged commit 4637bb5 into telekom:master Apr 25, 2024
@martingrossmann
Copy link
Contributor

@erickubenka I build a new snapshot version 2.8-SNAPSHOT with the latest master. Please check it out.

@erickubenka
Copy link
Contributor Author

@martingrossmann

So i took the testerra-skeletons project, upgraded my dependencies to 2.8-SNAPSHOT and things worked well.

For openjdk-11, which i run in a docker container, everything worked well.

For openjdk-17, I ran into the following error, but was able to handle it by allowing deep reflections with new jvm option --add-opens

So for openjdk-17 command looks like this:

java --add-opens=java.base/java.lang=ALL-UNNAMED -jar build/libs/testerra-skeletons-2-SNAPSHOT.jar

And just for completion, the error that I ran into when executing fat jar without --add-opens flag

25.04.2024 21:29:33.700 [main][INFO]: common.Testerra - ####################################################
25.04.2024 21:29:33.715 [main][INFO]: common.Testerra - #                     .8t .                        #
25.04.2024 21:29:33.715 [main][INFO]: common.Testerra - #                    .8t ;;                        #
25.04.2024 21:29:33.715 [main][INFO]: common.Testerra - #                   :@S %S8:;                      #
25.04.2024 21:29:33.715 [main][INFO]: common.Testerra - #                   88   8   ;.                    #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #                 .X8.   SS .8 ;                   #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #                 @8.     88.  X..8                #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #       .SX.    88        %S @..S X8               #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #       .88 8.  SS          8 ;   %8@t             #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #       @8 88;ttX;.         ::     @8;@@           #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #      88.  @X:X;                   @S :@@         #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #    .88.   .XX:                    .8.. ;8@       #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #    X@                               X@ . 8S      #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #  .%@:                                X8.  ;8X    #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #  tt@XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSS%@8@8S::  #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #                                                  #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #    T    E     S     T     E    R     R     A     #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #                                                  #
25.04.2024 21:29:33.716 [main][INFO]: common.Testerra - #                   2.8-SNAPSHOT                   #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - ####################################################
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - # build.java.version: 11                           #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - # build.os.name:      Linux                        #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - # build.os.arch:      amd64                        #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - # build.os.version:   4.15.0-128-generic           #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - # build.user.name:    root                         #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - # build.timestamp:    Thu Apr 25 12:34:31 UTC 2024 #
25.04.2024 21:29:33.717 [main][INFO]: common.Testerra - ####################################################
25.04.2024 21:29:33.819 [main][INFO]: common.Testerra - Register IoC modules: CoreHook, DriverUiHook, DriverUi_Desktop, ReportModelHook, ReportNgHook
Exception in thread "main" java.lang.ExceptionInInitializerError
        at eu.tsystems.mms.tic.testframework.testing.WebDriverManagerProvider.<clinit>(WebDriverManagerProvider.java:32)
        at Main.main(Main.java:9)
Caused by: com.google.common.util.concurrent.UncheckedExecutionException: java.lang.IllegalStateException: Unable to load cache item
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2087)
        at com.google.common.cache.LocalCache.get(LocalCache.java:4036)
        at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4059)
        at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:5041)
        at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:5048)
        at com.google.inject.internal.FailableCache.get(FailableCache.java:51)
        at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:48)
        at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:155)
        at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:595)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:932)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:852)
        at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:291)
        at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:222)
        at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:938)
        at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:48)
        at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:60)
        at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
        at com.google.inject.Guice.createInjector(Guice.java:87)
        at com.google.inject.Guice.createInjector(Guice.java:69)
        at com.google.inject.Guice.createInjector(Guice.java:59)
        at eu.tsystems.mms.tic.testframework.common.Testerra.initIoc(Testerra.java:206)
        at eu.tsystems.mms.tic.testframework.common.Testerra.<clinit>(Testerra.java:143)
        ... 2 more
Caused by: java.lang.IllegalStateException: Unable to load cache item
        at com.google.inject.internal.cglib.core.internal.$LoadingCache.createEntry(LoadingCache.java:79)
        at com.google.inject.internal.cglib.core.internal.$LoadingCache.get(LoadingCache.java:34)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:291)
        at com.google.inject.internal.cglib.reflect.$FastClass$Generator.create(FastClass.java:65)
        at com.google.inject.internal.BytecodeGen.newFastClassForMember(BytecodeGen.java:258)
        at com.google.inject.internal.BytecodeGen.newFastClassForMember(BytecodeGen.java:207)
        at com.google.inject.internal.DefaultConstructionProxyFactory.create(DefaultConstructionProxyFactory.java:49)
        at com.google.inject.internal.ProxyFactory.create(ProxyFactory.java:156)
        at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:92)
        at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:29)
        at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:37)
        at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:33)
        at com.google.inject.internal.FailableCache$1.load(FailableCache.java:40)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3589)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2328)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2187)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2081)
        ... 24 more
Caused by: java.lang.ExceptionInInitializerError
        at com.google.inject.internal.cglib.core.$DuplicatesPredicate.evaluate(DuplicatesPredicate.java:104)
        at com.google.inject.internal.cglib.core.$CollectionUtils.filter(CollectionUtils.java:52)
        at com.google.inject.internal.cglib.reflect.$FastClassEmitter.<init>(FastClassEmitter.java:69)
        at com.google.inject.internal.cglib.reflect.$FastClass$Generator.generateClass(FastClass.java:77)
        at com.google.inject.internal.cglib.core.$DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator.generate(AbstractClassGenerator.java:329)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
        at com.google.inject.internal.cglib.core.internal.$LoadingCache$2.call(LoadingCache.java:54)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at com.google.inject.internal.cglib.core.internal.$LoadingCache.createEntry(LoadingCache.java:61)
        ... 41 more
Caused by: com.google.inject.internal.cglib.core.$CodeGenerationException: java.lang.reflect.InaccessibleObjectException-->Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @45c8abff
        at com.google.inject.internal.cglib.core.$ReflectUtils.defineClass(ReflectUtils.java:464)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator.generate(AbstractClassGenerator.java:336)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)
        at com.google.inject.internal.cglib.core.internal.$LoadingCache$2.call(LoadingCache.java:54)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at com.google.inject.internal.cglib.core.internal.$LoadingCache.createEntry(LoadingCache.java:61)
        at com.google.inject.internal.cglib.core.internal.$LoadingCache.get(LoadingCache.java:34)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)
        at com.google.inject.internal.cglib.core.$AbstractClassGenerator.create(AbstractClassGenerator.java:291)
        at com.google.inject.internal.cglib.core.$KeyFactory$Generator.create(KeyFactory.java:221)
        at com.google.inject.internal.cglib.core.$KeyFactory.create(KeyFactory.java:174)
        at com.google.inject.internal.cglib.core.$KeyFactory.create(KeyFactory.java:157)
        at com.google.inject.internal.cglib.core.$KeyFactory.create(KeyFactory.java:149)
        at com.google.inject.internal.cglib.core.$KeyFactory.create(KeyFactory.java:145)
        at com.google.inject.internal.cglib.core.$MethodWrapper.<clinit>(MethodWrapper.java:23)
        ... 52 more
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @45c8abff
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
        at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
        at com.google.inject.internal.cglib.core.$ReflectUtils$1.run(ReflectUtils.java:61)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
        at com.google.inject.internal.cglib.core.$ReflectUtils.<clinit>(ReflectUtils.java:52)
        at com.google.inject.internal.cglib.reflect.$FastClassEmitter.<init>(FastClassEmitter.java:67)
        ... 49 more

So thanks for the fast update and the provided SNAPSHOT version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Unable to initialize modules when run built fat jar
2 participants