Testing tools for javac and annotation processors

Overview

Compile Testing

Build Status Maven Release Javadoc

A library for testing javac compilation with or without annotation processors. See the javadoc for usage examples.

License

Copyright 2013 Google, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • generateSources cannot find JavacTool

    generateSources cannot find JavacTool

    When I have ....generateSources(JavaFileObjects.forSourceString("HelloWorld", "public class HelloWorld { }\n")); I get an error (see below), this is true even if I use forResource(String) for a file I used in the source list to ASSERT.about(javaSources()).that(...). Everything else works, it seems to be some sort of configuration issue.

    ERROR!
    java.lang.NoClassDefFoundError: com/sun/tools/javac/api/JavacTool
        at com.google.testing.compile.Compilation.parse(Compilation.java:86)
        at com.google.testing.compile.JavaSourcesSubject$SuccessfulCompilationBuilder.generatesSources(JavaSourcesSubject.java:255)
        at com.imminentmeals.prestige.codegen.TestController.testControllerForPresentationWithProtocol(TestController.java:167)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
        at $Proxy0.invoke(Unknown Source)
        at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)
        at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
    Caused by: java.lang.ClassNotFoundException: com.sun.tools.javac.api.JavacTool
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        ... 32 more
    
    opened by imminent 17
  • Provide ClassLoader for loading generated classes and resources

    Provide ClassLoader for loading generated classes and resources

    Add Compilation.classLoader() method (and an overloaded version that takes a parent classloader). The returned ClassLoader is useful for loading generated classes and resources.

    type=enhancement wontfix cla: yes 
    opened by dnault 10
  • Annotation processor's Filer can't read the files being compiled

    Annotation processor's Filer can't read the files being compiled

    I have a code in my annotation processor and it works fine when I compile sources using this annotation processor (with Maven, for example). Simplified version of code looks like this:

    try {
        FileObject fileObject = filer.getResource(StandardLocation.SOURCE_PATH, "org.example", "MyMapper.java");
        String content = fileObject.getCharContent(false).toString();
    } catch (IOException e) {
        // ...
    }
    

    When I try to test my code using compile-testing, it fails on the first line with error:

    java.io.FileNotFoundException: org.example/MyMapper.java
    

    If I change the location from StandardLocation.SOURCE_PATH to StandardLocation.SOURCE_OUTPUT), then Filer will successfully return FileObject in the first line, but then the code will fail in the second line, where I try to read the contents of FileObject:

    java.io.FileNotFoundException
    

    FileNotFound without any message.

    I have a small repro in this branch - https://github.com/jbreathe/corgi/tree/ct-issue. You can find test itself here. And class where Filer used here (getFileObject and readAllLines methods).

    Version of Java is 14.

    Maybe the second one is a known issue? And about the first one - can I read FileObject using StandardLocation.SOURCE_PATH?

    UPD: to be more clear - I'm trying to read a file that is passed to "Compiler#compile". See test for more details.

    type=defect P2 
    opened by ghost 9
  • Unknown variable type java.util.Map<java.lang.String,java.lang.Integer> for declared

    Unknown variable type java.util.Map for declared

    I don't know if I am doing something wrong but this seems odd to me.

    To reproduce this:

    @Test
    public void testMap() {
        final JavaFileObject actualSource = JavaFileObjects.forSourceString("test/MapTest", Joiner.on('\n').join(
            "package test;",
    
            "import nsmodelextractor.Extract;",
    
            "import java.util.Map;",
            "import java.lang.String;",
            "import java.lang.Integer;",
    
            "public class MapTest {",
                "@Extract Map<String, Integer> map = null;",
            "}")
        );
    
        assertAbout(javaSource()).that(actualSource).compilesWithoutError();
    }
    

    The extract annotations looks like this

    @Retention(CLASS)
    @Target(FIELD)
    public @interface Extract {
        String name() default "";
    }
    

    I also tried it without any imports. However I keep on getting

    Unknown variable type java.util.Map<java.lang.String,java.lang.Integer> for declared

    I'm using com.google.testing.compile:compile-testing:0.7

    opened by vanniktech 8
  • If compiler is not present it throws an NPE

    If compiler is not present it throws an NPE

    I was running this project for the first time and got a NPE....

    So I grab the sources and figure out was a really simple fix, and didn't hurt add a polished message

    cla: yes 
    opened by velo 8
  • Alternate propositions for generated source

    Alternate propositions for generated source

    I'm thinking of something on the order of

    ASSERT.about(javaSources()).that(source)
        .compileswithoutError().and()
        .generatesSourceAtPath("path").containingSnippets("some valid snippet").and()
        .generatesSourceAtPath("path").containingMethods(
            "method signature1", 
            "method signature2").and()
        .generatesSourceAtPath("path").containingFields(
            "String foo", 
            "private Blah blah").and()
         ...
    

    Doesn't have to be exactly like this, and the snippets version could stand in for all the rest. But it would be nice to ask things about the generated output while testing.

    type=enhancement 
    opened by cgruber 8
  • Compile with Lombok Annotations

    Compile with Lombok Annotations

    Hello,

    i generate Java Files with Lombok Annotations from my own Annotation Processor, when testing i get the following compile error : "is not abstract and does not override abstract method".

    Test Case

        void process() {
            ReleationProcessor releationProcessor = new ReleationProcessor();
            Compilation compilation = javac()
                    .withProcessors(releationProcessor)
                    .compile(JavaFileObjects.forResource("TestFile.java"));
            CompilationSubject.assertThat(compilation).succeeded();
    

    Generated File from Annotation Processor

    @Setter
    @Getter
    public final class Testing implements Model {
      private String targetType;
    }
    

    On my normal build everything works fine. Is there some way to ignore the compile error or add an option for Lombok Annotations.

    Ty Mom0

    P4 type=other 
    opened by Mom0aut 7
  • Inline Guava

    Inline Guava

    As you already probably know, Guava is notoriously known for causing conflicts because of its aggressive pruning policy. And well, that's exactly the blocker for me.

    As I briefly mentioned in https://github.com/google/compile-testing/issues/124, the last released version of compile-testing pulls Guava 20.0 which is incompatible with Neo4j (that pulls Guava 18.0).

    Would you consider releasing an extra artefact that inlines Guava (or removing Guava altogether but that's probably not that easy).

    opened by fbiville 7
  • compilesWithoutError failure is hard to understand without the generated sources.

    compilesWithoutError failure is hard to understand without the generated sources.

    If I have a generated source with a compile error, it is difficult to understand what the error is from the error message alone since there is no easy way to compare to the actual source.

    It would be nice if the error message dumped a copy of the source file annotated with the compile errors. In general having easier access to the generated sources would make iterative test development easier.

    opened by lukesandberg 7
  • Add an ability to pass in compiler configuration options

    Add an ability to pass in compiler configuration options

    Add an ability to pass in compiler configuration options (say, to configure annotation processors' flags).


    Created by MOE: http://code.google.com/p/moe-java MOE_MIGRATED_REVID=85151739

    type=enhancement cla: yes 
    opened by cgruber 6
  • Fails in Java6 projects when using deployed artifact.

    Fails in Java6 projects when using deployed artifact.

    Due to subtle issues iwth java6/java7 and the com.sun.tools.javac.api crap, NoSuchMethodErrors are being thrown when deployed artifact is being used with any Java6 API.

    java.lang.NoSuchMethodError: com.sun.tools.javac.api.JavacTool.getStandardFileManager(Ljavax/tools/DiagnosticListener;Ljava/util/Locale;Ljava/nio/charset/Charset;)Lcom/sun/tools/javac/file/JavacFileManager;
        at com.google.testing.compile.Compilation.compile(Compilation.java:60)
        at com.google.testing.compile.JavaSourcesSubject$CompilationClause.compilesWithoutError(JavaSourcesSubject.java:89)
        at my.tests..MyTest.testFoo(MyTest.java:75)
            ...
    

    Not sure why - the API doesn't SEEM to have changed between versions, though I might have missed it. The call in question might need to be made reflectively in order to try one, then the other. But we should build it in 6 so it can be used in 6, and deploy from that build, OR we should decide that Java6 is not supported and document it.

    type=defect fixed 
    opened by cgruber 6
  • [BUG] InMemoryJavaFileManager.uriForJavaFileObject() breaks when supplied with a Locations.ModuleLocationHandler

    [BUG] InMemoryJavaFileManager.uriForJavaFileObject() breaks when supplied with a Locations.ModuleLocationHandler

    In InMemoryJavaFileManager the method uriForJavaFileObject() is defined as such:

    private static URI uriForJavaFileObject(Location location, String className, Kind kind) {
    return URI.create(
        "mem:///" + location.getName() + '/' + className.replace('.', '/') + kind.extension);
    }
    

    EXPECTED: This method works for any Location object.

    ACTUAL:

    This breaks when using modules.

    When the JavacTask runs validate() on the arguments in JavacTaskImpl.prepareCompiler(), if a module has been found, the CLASS_OUTPUT location will be determined by asking the JavaFileManager for the location for that module

    fm.getLocationForModule(StandardLocation.CLASS_OUTPUT, moduleName)
    

    This will lead to Locations.OutputLocationHandler.getLocationForModule(moduleName) being called, which returns a Location of type Locations.ModuleLocationHandler with the name set to location.getName() + "[" + name + "]" eg. "CLASS_OUTPUT[foo]" if the module name is "foo".

    @Override
    Location getLocationForModule(String name) {
        if (moduleTable == null) {
            moduleTable = new ModuleTable();
        }
        ModuleLocationHandler l = moduleTable.get(name);
        if (l == null) {
            Path out = outputDir.resolve(name);
            l = new ModuleLocationHandler(this, location.getName() + "[" + name + "]",
                    name, Collections.singletonList(out), true);
            moduleTable.add(l);
        }
        return l;
    }
    

    The validate() method will then call getJavaFileForInput() using this location, which calls the InMemoryJavaFileManager.uriForJavaFileObject() method.

    Due to location.getName returning "CLASS_OUTPUT[foo]", URL.create will throw the following exception:

    java.lang.IllegalArgumentException: Illegal character in path
    

    It gives index 19, which is the square opening bracket [ in mem:///CLASS_OUTPUT[test]/....

    This makes it not possible to directly use location.getName() in the uriForJavaFileObject() method for any given Location object, without encoding this name in some form, before passing it along to URL.create()

    SOLUTION: Encode the location name in some way, so that illegal URI characters won't be passed along to the URL.create() method.

    VERSIONS USED: compile-testing: 0.19 JDK: AZUL-17 version 17.0.4.1

    type=defect P3 
    opened by CC007 4
  • Fix checkstyle plugin, fix errors reported by checkstyle

    Fix checkstyle plugin, fix errors reported by checkstyle

    From a previous discussion, I was invited to fix checkstyle currently not working properly. This PR is my take on that. What it does:

    • pom.xl:
      • make checkstyle plugin work again
      • fix warning about required maven version
    • fixes 13 errors reported by checkstyle plugin
    • adds a maven wrapper to the project.

    TODO: run checkstyle in CI, this is left up for you.

    cla: yes P3 type=other 
    opened by deining 0
  • Access to compiler internal APIs will fail starting with JDK 16

    Access to compiler internal APIs will fail starting with JDK 16

    JDK 16 will change the default for the --illegal-access flag from permit to deny. This means that, by default, compile-testing tests will fail with messages like this:

    class com.google.testing.compile.Parser (in unnamed module @0x4114d843) cannot access class
    com.sun.tools.javac.api.JavacTool (in module jdk.compiler) because module jdk.compiler does not export
    com.sun.tools.javac.api to unnamed module @0x4114d843
    

    That can be worked around either by explicitly specifying, on the command line of the JVM running the tests, either --illegal-access=permit or --add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED. We should document that, and perhaps later find a way to make it unnecessary.

    type=defect P3 
    opened by eamonnmcmanus 3
  • Javac plugins cannot be found

    Javac plugins cannot be found

    I am trying to use this library to unit test a javac plugin.

    The plugin works fine when compilation is done through javac directly:

    javac src/test/resources/HelloWorld.java -Xplugin:SamplePlugin -cp 'target/classes/'
    

    But the following unit test fails:

    /**
     * Fails, while it shouldn't. The error message:
     * error: plug-in not found: SamplePlugin
     * No files were generated.
     *   at [email protected]/sample.SampleTest.withPlugin(SampleTest.java:48)
     */
    @Test
    public void withPlugin() {
    	Compilation compilation = Compiler.javac()
    			.withOptions("-Xplugin:SamplePlugin")
    			.withClasspath(List.of(new File("target/classes")))
    			.compile(JavaFileObjects.forResource("HelloWorld.java"));
    	CompilationSubject.assertThat(compilation).succeeded();
    }
    

    The classpath itself is correct, as demonstrated by these unit tests:

    /**
     * The compilation fails due to {@code sample.SampleClass} not being available.
     */
    @Test
    public void withoutClasspath() {
    	Compilation compilation = Compiler.javac()
    			.compile(JavaFileObjects.forResource("HelloWorld.java"));
    	CompilationSubject.assertThat(compilation).failed();
    }
    
    /**
     * Compilation succeeds.
     */
    @Test
    public void withoutPlugin() {
    	Compilation compilation = Compiler.javac()
    			.withClasspath(List.of(new File("target/classes")))
    			.compile(JavaFileObjects.forResource("HelloWorld.java"));
    	CompilationSubject.assertThat(compilation).succeeded();
    }
    

    I have uploaded this minimalistic sample Maven project to help the confirmation and the reproduction of this issue: Sample.zip

    type=defect P3 
    opened by Trigary 0
  • generatesFiles() reports incorrect message if file is present but content doesn't match

    generatesFiles() reports incorrect message if file is present but content doesn't match

    If a matching file is found but the content just doesn't match, generatesFiles() will report that no matching file was found. While maybe technically correct if "matching" in this case includes the content, it's misleading in practice since the target file name was found and the content mismatch is the interesting bit.

    type=defect P3 
    opened by ZacSweers 1
Releases(v0.21.0)
  • v0.21.0(Dec 12, 2022)

    • Fixed a bug: When comparing ASTs, for example in JavaFileObjectSubject.hasSourceEquivalentTo, some kinds of nodes were omitted from the comparison. In particular, if the expected code had an annotated type or a union type (multicatch), the actual code could contain anything at that point and the test would still pass. This was also true for post-Java-8 constructs like module declarations, yield statements, and the like. These omissions have been corrected. Some tests may now fail if the expected and actual source do not match, in ways that were hidden by this bug. (https://github.com/google/compile-testing/commit/9a592f77821adecf10a16a7a4cdd2f071ddcf136)
    Source code(tar.gz)
    Source code(zip)
  • compile-testing-0.20(Dec 1, 2022)

    • Allow sources being compiled to be read from annotation processors. (95e749d)
    • Fix false negative when comparing source files that differ only in try-with-resources specifications. (cb6486c)
    • Add withAnnotationProcessorPath() to Compiler. (80a9ee0)
    • Improve error messages rendered by JavaSourcesSubject.parsesAs() and JavaFileObjectSubject.containsElementsIn() to more easily distinguish between errors incurred in actual vs expected source. (115014e)
    • Use @Nullable from the Checker Framework and fix a few null-correctness issues. (6260258)
    • Fixed bug where testing package-info.java with parsesAs() threw a NullPointerException. (c46b1b6)
    • Close JavaCompiler objects to avoid resource leaks. (cd2c0a8)
    Source code(tar.gz)
    Source code(zip)
  • compile-testing-0.19(Oct 21, 2020)

    • Updated Truth usages to be compatible with Truth 1.0 and higher.
    • Improved exception thrown by onLine(n) when n is out of range. (b4eaa92)
    Source code(tar.gz)
    Source code(zip)
  • compile-testing-0.18(May 30, 2019)

  • compile-testing-0.17(May 8, 2019)

  • compile-testing-0.16(May 8, 2019)

    • Migrated off Truth's removed failWithRawMessage and deprecated fail. (2678c3674c99e83165d80aaae369c00f31ff6c40, 3f1f22201d9cd0a2f1d5b3255e5787645f098d5c)
    • CompilationSubject.succeeded() now shows warnings as well as errors on failure. (7d31b53)
    • Make ForwardingStandardJavaFileManager public. (acf6ae7)
    • Add withClasspath(Iterable<File>) to Compiler and JavaSourcesSubject and deprecate withClasspathFrom(ClassLoader) (7622471)
    Source code(tar.gz)
    Source code(zip)
  • compile-testing-0.15(Dec 21, 2017)

  • compile-testing-0.14(Dec 7, 2017)

  • compile-testing-0.13(Nov 20, 2017)

    • Upgrade Truth dependency to 0.36 and make required changes, including changing from SubjectFactory to Subject.Factory (which should usually be transparent to users as long as they recompile).
    • Make a few assertions work better with expect and similar failure strategies.
    • Start preparing for Java 9.
    Source code(tar.gz)
    Source code(zip)
  • compile-testing-0.12(Sep 11, 2017)

  • compile-testing-0.11(May 1, 2017)

  • compile-testing-0.10(Oct 26, 2016)

Owner
Google
Google ❤️ Open Source
Google
An addon that is trying to recreate Tinker's Construct within Slimefun. Adds new customisable tools with leveling and modifiers.

SlimeTinker is a Slimefun4 addon that tries it's best to recreate the amazing Tinker's Construct Mod (link) in Vanilla Minecraft. Features include: Th

null 22 Nov 6, 2022
Java 1-15 Parser and Abstract Syntax Tree for Java, including preview features to Java 13

JavaParser This project contains a set of libraries implementing a Java 1.0 - Java 14 Parser with advanced analysis functionalities. This includes pre

JavaParser 4.5k Jan 9, 2023
Elegant parsing in Java and Scala - lightweight, easy-to-use, powerful.

Please see https://repo1.maven.org/maven2/org/parboiled/ for download access to the artifacts https://github.com/sirthias/parboiled/wiki for all docum

Mathias 1.2k Dec 21, 2022
Chamomile is a Java Virtual Machine class file assembler and disassembler.

Chamomile is a Java Virtual Machine class file assembler and disassembler. Installation Maven <repositories> <repository> <id>jitpack.io</

null 15 May 24, 2022
Bank Statement Analyzer Application that currently runs in terminal with the commands: javac Application.java java Application [file-name].csv GUI coming soon...

Bank Statement Analyzer Application that currently runs in terminal with the commands: javac Application.java java Application [file-name].csv GUI coming soon...

Hayden Hanson 0 May 21, 2022
A small mod to improve support for architectures and libraries officially unsupported by Minecraft. Mainly targeting Apple Macs using arm processors.

fabric-loom-native-support A small mod to improve support for architectures and libraries officially unsupported by Minecraft. Mainly targeting Apple

FabricMC 5 Oct 17, 2022
Ghidra Plugin for Fujitsu FR60 Processors. Focused on DVRP's MB91302A in the Sony PSX.

Fujitsu FR60 Ghidra Plugin This repository contains a plugin for Ghidra that enables decompilation support for FR60 processors from Fujitsu. In partic

null 13 Jan 3, 2023
GMC-Tools - Plugin with basic tools for Minecraft server administrator

GMC-Tools - Plugin with basic tools for Minecraft server administrator. Currently we do not support configuration files and we do not recommend using this plugin on production servers.

GamesMC Studios 4 Jan 14, 2022
Java testing framework for testing pojo methods

Java testing framework for testing pojo methods. It tests equals, hashCode, toString, getters, setters, constructors and whatever you report in issues ;)

Piotr Joński 48 Aug 23, 2022
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, folds, optics and typeclasses.

Derive4J: Java 8 annotation processor for deriving algebraic data types constructors, pattern matching and more! tl;dr Show me how to write, say, the

null 543 Nov 23, 2022
Java 8 annotation processor and framework for deriving algebraic data types constructors, pattern-matching, folds, optics and typeclasses.

Derive4J: Java 8 annotation processor for deriving algebraic data types constructors, pattern matching and more! tl;dr Show me how to write, say, the

null 543 Nov 23, 2022
Annotation processor to create immutable objects and builders. Feels like Guava's immutable collections but for regular value objects. JSON, Jackson, Gson, JAX-RS integrations included

Read full documentation at http://immutables.org // Define abstract value type using interface, abstract class or annotation @Value.Immutable public i

Immutables 3.2k Dec 31, 2022
KickAss Configuration. An annotation-based configuration system for Java and Kotlin

KAConf 2016-2020 Mario Macías KickAss Configuration v0.9.0 is an Annotation-based configuration system inspired in the wonderful Spring Boot. Its stro

Mario Macías 53 Nov 21, 2022
Powerful event-bus optimized for high throughput in multi-threaded applications. Features: Sync and Async event publication, weak/strong references, event filtering, annotation driven

MBassador MBassador is a light-weight, high-performance event bus implementing the publish subscribe pattern. It is designed for ease of use and aims

Benjamin Diedrichsen 930 Jan 6, 2023
An annotation-based Java library for creating Thrift serializable types and services.

Drift Drift is an easy-to-use, annotation-based Java library for creating Thrift clients and serializable types. The client library is similar to JAX-

null 225 Dec 24, 2022
Annotation/Reflection Based Bukkit Command API. Containing many features such as help-service, command providers, tab completion, and many more!

CommandAPI Annotation/Reflection Based Command API that just does what you want it to do without any problems. Importing Maven <repository> <id>

damt 1 Jun 13, 2022
Spring JPA Many To Many example with Hibernate and Spring Boot CRUD Rest API - ManyToMany annotation

Spring JPA Many To Many example with Hibernate and Spring Boot CRUD Rest API - ManyToMany annotation

null 17 Dec 28, 2022
An annotation processor for generating type-safe bean mappers

MapStruct - Java bean mappings, the easy way! What is MapStruct? Requirements Using MapStruct Maven Gradle Documentation and getting help Building fro

null 5.8k Dec 31, 2022