Code metrics for Java code by means of static analysis

Overview

CK

Build Status Code Coverage Maven Central

CK calculates class-level and method-level code metrics in Java projects by means of static analysis (i.e. no need for compiled code). Currently, it contains a large set of metrics, including the famous CK:

  • CBO (Coupling between objects): Counts the number of dependencies a class has. The tools checks for any type used in the entire class (field declaration, method return types, variable declarations, etc). It ignores dependencies to Java itself (e.g. java.lang.String).

  • CBO Modified (Coupling between objects): Counts the number of dependencies a class has. It is very similar to the CKTool's original CBO. However, this metric considers a dependency from a class as being both the references the type makes to others and the references that it receives from other types.

  • FAN-IN: Counts the number of input dependencies a class has, i.e, the number of classes that reference a particular class. For instance, given a class X, the fan-in of X would be the number of classes that call X by referencing it as an attribute, accessing some of its attributes, invoking some of its methods, etc.

  • FAN-OUT: Counts the number of output dependencies a class has, i.e, the number of other classes referenced by a particular class. In other words, given a class X, the fan-out of X is the number of classes called by X via attributes reference, method invocations, object instances, etc.

  • DIT (Depth Inheritance Tree): It counts the number of "fathers" a class has. All classes have DIT at least 1 (everyone inherits java.lang.Object). In order to make it happen, classes must exist in the project (i.e. if a class depends upon X which relies in a jar/dependency file, and X depends upon other classes, DIT is counted as 2).

  • NOC (Number of Children): It counts the number of immediate subclasses that a particular class has.

  • Number of fields: Counts the number of fields. Specific numbers for total number of fields, static, public, private, protected, default, final, and synchronized fields.

  • Number of methods: Counts the number of methods. Specific numbers for total number of methods, static, public, abstract, private, protected, default, final, and synchronized methods. Constructor methods also count here.

  • Number of visible methods: Counts the number of visible methods. A method is visible if it is not private.

  • NOSI (Number of static invocations): Counts the number of invocations to static methods. It can only count the ones that can be resolved by the JDT.

  • RFC (Response for a Class): Counts the number of unique method invocations in a class. As invocations are resolved via static analysis, this implementation fails when a method has overloads with same number of parameters, but different types.

  • WMC (Weight Method Class) or McCabe's complexity. It counts the number of branch instructions in a class.

  • LOC (Lines of code): It counts the lines of count, ignoring empty lines and comments (i.e., it's Source Lines of Code, or SLOC). The number of lines here might be a bit different from the original file, as we use JDT's internal representation of the source code to calculate it.

  • LCOM (Lack of Cohesion of Methods): Calculates LCOM metric. This is the very first version of metric, which is not reliable. LCOM-HS can be better (hopefully, you will send us a pull request).

  • LCOM* (Lack of Cohesion of Methods): This metric is a modified version of the current version of LCOM implemented in CK Tool. LCOM* is a normalized metric that computes the lack of cohesion of class within a range of 0 to 1. Then, the closer to 1 the value of LCOM* in a class, the less the cohesion degree of this respective class. The closer to 0 the value of LCOM* in a class, the most the cohesion of this respective class. This implementation follows the third version of LCOM* defined in [1].

    • Reference: [1] Henderson-Sellers, Brian, Larry L. Constantine and Ian M. Graham. “Coupling and cohesion (towards a valid metrics suite for object-oriented analysis and design).” Object Oriented Systems 3 (1996): 143-158.
  • TCC (Tight Class Cohesion): Measures the cohesion of a class with a value range from 0 to 1. TCC measures the cohesion of a class via direct connections between visible methods, two methods or their invocation trees access the same class variable.

  • LCC (Loose Class Cohesion): Similar to TCC but it further includes the number of indirect connections between visible classes for the cohesion calculation. Thus, the constraint LCC >= TCC holds always.

  • Quantity of returns: The number of return instructions.

  • Quantity of loops: The number of loops (i.e., for, while, do while, enhanced for).

  • Quantity of comparisons: The number of comparisons (i.e., == and !=). Note: != is only available in 0.4.2+.

  • Quantity of try/catches: The number of try/catches

  • Quantity of parenthesized expressions: The number of expressions inside parenthesis.

  • String literals: The number of string literals (e.g., "John Doe"). Repeated strings count as many times as they appear.

  • Quantity of Number: The number of numbers (i.e., int, long, double, float) literals.

  • Quantity of Math Operations: The number of math operations (times, divide, remainder, plus, minus, left shit, right shift).

  • Quantity of Variables: Number of declared variables.

  • Max nested blocks: The highest number of blocks nested together.

  • Quantity of Anonymous classes, inner classes, and lambda expressions: The name says it all. Note that whenever an anonymous class or an inner class is declared, it becomes an "entire new class", e.g., CK generates A.B and A.B$C, C being an inner class inside A.B. However, lambda expressions are not considered classes, and thus, are part of the class/method they are embedded into. A class or a method only has the number of inner classes that are declared at its level, e.g., an inner class that is declared inside a method M2, that is inside an anonymous class A, that is declared inside a method M, that finally is declared inside a class C, will not count in class C, but only in method M2 (first-level method it is embodied), and anonymous class A (first-level class it is embodied).

  • Number of unique words: Number of unique words in the source code. At method level, it only uses the method body as input. At class level, it uses the entire body of the class as metrics. The algorithm basically counts the number of words in a method/class, after removing Java keywords. Names are split based on camel case and underline (e.g., longName_likeThis becomes four words). See WordCounter class for details on the implementation.

  • Number of Log Statements: Number of log statements in the source code. The counting uses REGEX compatible with SLF4J and Log4J API calls. See NumberOfLogStatements.java and the test examples (NumberOfLogStatementsTest and fixtures/logs) for more info.

  • Has Javadoc: Boolean indicating whether a method has javadoc. (Only at method-level for now)

  • modifiers: public/abstract/private/protected/native modifiers of classes/methods. Can be decoded using org.eclipse.jdt.core.dom.Modifier.

  • Usage of each variable: How often each variable was used inside each method.

  • Usage of each field: How often each local field was used inside each method, local field are fields within a class (subclasses are not included). Also indirect local field usages are detected, indirect local field usages include all usages of fields within the local invocation tree of a class e.g. A invokes B and B uses field a, then a is indirectly used by A.

  • Method invocations: All directly invoked methods, variations are local invocations and indirect local invocations.

Note: CK separates classes, inner classes, and anonymous classes. LOC is the only metric that is not completely isolated from the others, e.g., if A has a declaration of an inner class B, then LOC(A) = LOC(class A) + LOC(inner class B).

How to use the standalone version

You need at least Java 8 to be able to compile and run this tool.

To use the latest version (which you should), clone the project and generate a JAR. A simple mvn clean compile package generates the single JAR file for you (see your target folder).

Then, just run:

java -jar ck-x.x.x-SNAPSHOT-jar-with-dependencies.jar <project dir> <use jars:true|false> <max files per partition, 0=automatic selection> <variables and fields metrics? True|False> <output dir>

Project dir refers to the directory where CK can find all the source code to be parsed. Ck will recursively look for .java files. CK can use the dependencies of the project as to improve its precision. The use jars parameters tells CK to look for any .jar files in the directory and use them to better resolve types. Max files per partition tells JDT the size of the batch to process. Let us decide that for you and start with 0; if problems happen (i.e., out of memory) you think of tuning it. Variables and field metrics indicates to CK whether you want metrics at variable- and field-levels too. They are highly fine-grained and produce a lot of output; you should skip it if you only need metrics at class or method level. Finally, output dir refer to the directory where CK will export the csv file with metrics from the analyzed project.

The tool will generate three csv files: class, method, and variable levels.

How to integrate it in my Java app

Learn by example. See Runner.java class.

Maven

See the most recent version of the library in the badge at the beginning of this README, or at https://mvnrepository.com/artifact/com.github.mauricioaniche/ck.

Use the following snippet in your pom.xml. Update X.Y.Z with the most recent version of the tool (check mvnrepository.com or the badge at the beginning of this README file):

<!-- https://mvnrepository.com/artifact/com.github.mauricioaniche/ck -->
<dependency>
    <groupId>com.github.mauricioaniche</groupId>
    <artifactId>ck</artifactId>
    <version>X.Y.Z</version>
</dependency>

You also may use the CK maven plugin, developed by @jazzmuesli, which automatically runs CK in your project. Very useful to developers: https://github.com/jazzmuesli/ck-mvn-plugin.

Supporting a new version of Java

This tool uses Eclipse's JDT Core library under the hood for AST construction. Currently the compliance version is set to Java 11.

Need support for a newer language version? The process of adding it is very straightforward, considering contributing a PR:

  1. Add a failing unit test case showcasing at least one of the syntax features present in the new version you want to provide support.
  2. Update the Eclipse JDT Core dependency in the pom.xml file. You may use a repository browser like MVN Repository to ease this process.
  3. Also in the pom.xml file, update the source and target properties of the Maven Compiler plugin accordingly.
  4. Adjust the following lines in CK.java:
    [...]
    ASTParser parser = ASTParser.newParser(AST.JLS11);
    [...]
    JavaCore.setComplianceOptions(JavaCore.VERSION_11, options);
    [...]
    
  5. Check if the failing unit test case you added in the first step is now green. Then submit a PR.

Why is it called CK?

Because the tool was born to just calculate the CK classLevelMetrics, but it grew beyond my expectations... Life is funny!

How to cite?

Please, use the following bibtex entry:

@manual{aniche-ck,
  title={Java code metrics calculator (CK)},
  author={Maurício Aniche},
  year={2015},
  note={Available in https://github.com/mauricioaniche/ck/}
}

How to Contribute

Just submit a PR! :)

License

This software is licensed under the Apache 2.0 License.

Comments
  • Build of fresh clone fails due to failing test

    Build of fresh clone fails due to failing test

    I am running mvn clean package on HEAD 17b80cb which fails due to a failing test.

    -------------------------------------------------------------------------------
    Test set: com.github.mauricioaniche.ck.NOCTest
    -------------------------------------------------------------------------------
    Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.012 s <<< FAILURE! - in com.github.mauricioaniche.ck.NOCTest
    shouldDetectChildren  Time elapsed: 0.009 s  <<< FAILURE!
    org.opentest4j.AssertionFailedError: expected: <1> but was: <2>
    	at com.github.mauricioaniche.ck.NOCTest.shouldDetectChildren(NOCTest.java:19)
    

    This happens on both a JDK11 and JDK16 Maven runner. Similarly, if I run the tests through IntelliJ, this is the only test that fails.

    opened by Arraying 16
  • New features

    New features

    Implementation of new metrics and support for the user to define the directory where he wants to export the .csv files provided by the tool as output.

    opened by BrunoLSousa 9
  • Incorrect CBO for Generic Classes

    Incorrect CBO for Generic Classes

    Suppose we have a generic class Box. The CBO returns 2 for the following class:

    public class Coupling6 {
        private Box<Integer> integerBox = new Box<Integer>();
    }
    

    However, I think it should return one.

    opened by aaghamohammadi 7
  • Use Apache commons-csv to write properly formatted CSV output

    Use Apache commons-csv to write properly formatted CSV output

    Addresses #17

    The effect of this change is that the CSVs are always valid, using the standard CSV (RFC 4180) format. For example, the method identifier getValue/3[int[],int[],String] will now be quoted in the output file, i.e., "getValue/3[int[],int[],String]", making the file readable by CSV parsers like pandas or R.

    I haven't written a test for this, since I would be testing apache/commons-csv, which seems to have a pretty good test suite.

    Also fixed an issue where result.getMathOperationsQty() was written twice per row in class.csv.

    opened by ayaankazerouni 7
  • Invalid environment settings

    Invalid environment settings

    Sometimes, running CK will cause:

    Exception in thread "main" java.lang.IllegalStateException: invalid environment settings
            at org.eclipse.jdt.core.dom.ASTParser.getClasspath(ASTParser.java:259)
            at org.eclipse.jdt.core.dom.ASTParser.createASTs(ASTParser.java:1001)
            at com.github.mauricioaniche.ck.CK.calculate(CK.java:113)
            at com.github.mauricioaniche.ck.CK.calculate(CK.java:62)
            at com.github.mauricioaniche.ck.Runner.main(Runner.java:43)
    

    For the cause of this, see this reply

    Original Issue, hidden by default

    Sometimes, running CK will cause:

    Exception in thread "main" java.lang.IllegalStateException: invalid environment settings
            at org.eclipse.jdt.core.dom.ASTParser.getClasspath(ASTParser.java:259)
            at org.eclipse.jdt.core.dom.ASTParser.createASTs(ASTParser.java:1001)
            at com.github.mauricioaniche.ck.CK.calculate(CK.java:113)
            at com.github.mauricioaniche.ck.CK.calculate(CK.java:62)
            at com.github.mauricioaniche.ck.Runner.main(Runner.java:43)
    

    This occurs arbitrarily, it was working on my machine, now it does not. A groupmate tried the exact same script on his laptop, where it worked, but it did not work on his desktop.

    We run the following inside our repository/metrics folder:

    java -jar ck.jar ../ false 0 false ./output/
    

    This is run on java version "11.0.6" 2020-01-14 LTS.

    Inside of CK#calculate(Path, CKNotifier, Path...) the paths to the .java files are all correct. There are no files there that should not be there.

    Curiously enough, ASTParser is not 1000+ lines so the stacktrace is hard to follow. The method looks as such:

            Main main = new Main(new PrintWriter(System.out), new PrintWriter(System.err), false, (Map)null, (CompilationProgress)null);
            ArrayList allClasspaths = new ArrayList();
    
            try {
                if ((this.bits & 32) != 0) {
                    Util.collectRunningVMBootclasspath(allClasspaths);
                }
    
                int i;
                int max;
                if (this.sourcepaths != null) {
                    i = 0;
    
                    for(max = this.sourcepaths.length; i < max; ++i) {
                        String encoding = this.sourcepathsEncodings == null ? null : this.sourcepathsEncodings[i];
                        main.processPathEntries(4, allClasspaths, this.sourcepaths[i], encoding, true, false);
                    }
                }
    
                if (this.classpaths != null) {
                    i = 0;
    
                    for(max = this.classpaths.length; i < max; ++i) {
                        main.processPathEntries(4, allClasspaths, this.classpaths[i], (String)null, false, false);
                    }
                }
    
                ArrayList pendingErrors = main.pendingErrors;
                if (pendingErrors != null && pendingErrors.size() != 0) {
                    throw new IllegalStateException("invalid environment settings");
                } else {
                    return allClasspaths;
                }
            } catch (IllegalArgumentException var6) {
                throw new IllegalStateException("invalid environment settings", var6);
            }
    

    It seems that pendingErrors is causing the problem, but the exception is supremely unhelpful and I have no idea what is going wrong. I have tried updating JDT but I cannot even find where it is released, their JavaDoc for the version I need is as good as non-existent.

    If anyone has faced this problem before and knows how to resolve it, please let me know. Otherwise, I will continue to look into it.

    opened by Arraying 5
  • Hidden files & ignored directories

    Hidden files & ignored directories

    This pull request introduces the fixes proposed in #92.

    More specifically, CK will now ignore all hidden directories (leading . on Linux/Mac, some attribute on Windows) when it is walking the project directory. Additionally, the existing .git ignore has been ported to work on every operating system.

    I added quite a few tests. I can verify that all those on Windows run, but I currently do not have a Linux (or Mac) machine to run the Linux specific tests. I hope that in case GitHub CI can't run these, someone can verify that these indeed pass.

    I've taken the liberty to increment the version and change some of the documentation. If there's anything else you want me to do, or change, let me know!

    opened by Arraying 4
  • Travis CI Build Failure

    Travis CI Build Failure

    This Travis CI build fails with the following error:

    [ERROR] /home/travis/build/AntoniosBarotsis/ck/src/main/java/com/github/mauricioaniche/ck/CK.java:[105,63] cannot access org.eclipse.core.runtime.Plugin
      bad class file: /home/travis/.m2/repository/org/eclipse/platform/org.eclipse.core.runtime/3.24.0/org.eclipse.core.runtime-3.24.0.jar(org/eclipse/core/runtime/Plugin.class)
        class file has wrong version 55.0, should be 52.0
        Please remove or make sure it appears in the correct subdirectory of the classpath.
    

    Raw logs can be found here.

    This fails due to the project using Java 8, switching the version to 11 or above fixes the issue. I was personally using a higher version and did not notice the build failure.

    I can't find information on the Maven repository or their website on which version of Java each version was compiled with.

    opened by AntoniosBarotsis 4
  • Fixed unspecified character encoding on Windows

    Fixed unspecified character encoding on Windows

    As part of the discussion in !90 is about, some unspecified character encodings make the build fail on Windows machines. I changed them to the universal double quote character, which makes the build pass on my Windows machine.

    opened by BrentMeeusen 4
  • Now, the calls to method reference are counted in the RFC metrics

    Now, the calls to method reference are counted in the RFC metrics

    I disabled one test method, bc no works well.

    (@mauricioaniche ) wrote in README.md that RFC fails when a method has overloads with same number of parameters, but different types.

    So I disabled this test case, it should be 2, not 1, but I go to improve RFC metric.

    opened by maykon-oliveira 4
  • Update JUnit to latest version

    Update JUnit to latest version

    I updated the pom to use Junit 5

    This new version has a readable api and some useful things, such as @DisplayName, to declare more friendly names for test cases.

    All old tests are ok with the new version of Junit, I had to change the package of some annotations, but everything works.

    issuecomment

    opened by maykon-oliveira 4
  • New feature to include method reference in RFC metric

    New feature to include method reference in RFC metric

    • Now the method reference calls are counted in the RFC metrics

    • I updated the pom to use Junit 5

    This new version has a readable api and some useful things, such as @DisplayName, to declare more friendly names for test cases.

    All old tests are ok with the new version of Junit, I had to change the package of some annotations, but everything works.

    opened by maykon-oliveira 4
  • Class-level TCC and LCC metrics output 0 or -1 if variables and fields metrics are disabled

    Class-level TCC and LCC metrics output 0 or -1 if variables and fields metrics are disabled

    This issue is easy to reproduce using the codebase of the current snapshot, so I don't attach any code or screenshot. I believe it is a bug, since the toggle for variables and field metrics should not affect the results for class-level metrics. Will make PRs if I can fix it.

    opened by escapar 2
  • Handling the space character in the fixtures folder path

    Handling the space character in the fixtures folder path

    Opa @mauricioaniche, eu clonei o projeto e tentei rodar os testes unitários, porém estava recebendo uma exceção de java.nio.file.NoSuchFileException, para a pasta fixtures.

    Todos os testes que carrega uma classe da pasta fixtures deu esse erro. Aqui está um pedaço de cima do log dos testes:

    [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ ck ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.github.mauricioaniche.ck.BindingsTest
    [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.174 s <<< FAILURE! - in com.github.mauricioaniche.ck.BindingsTest
    [ERROR] com.github.mauricioaniche.ck.BindingsTest  Time elapsed: 0.174 s  <<< ERROR!
    java.lang.RuntimeException: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\bindings
    	at com.github.mauricioaniche.ck.BindingsTest.setUp(BindingsTest.java:15)
    Caused by: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\bindings
    	at com.github.mauricioaniche.ck.BindingsTest.setUp(BindingsTest.java:15)
    [INFO] Running com.github.mauricioaniche.ck.CBOTest
    [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 s <<< FAILURE! - in com.github.mauricioaniche.ck.CBOTest
    [ERROR] com.github.mauricioaniche.ck.CBOTest  Time elapsed: 0 s  <<< ERROR!
    java.lang.RuntimeException: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\cbo
    	at com.github.mauricioaniche.ck.CBOTest.setUp(CBOTest.java:15)
    Caused by: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\cbo
    	at com.github.mauricioaniche.ck.CBOTest.setUp(CBOTest.java:15)
    [INFO] Running com.github.mauricioaniche.ck.ClassTypeTest
    [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 s <<< FAILURE! - in com.github.mauricioaniche.ck.ClassTypeTest
    [ERROR] com.github.mauricioaniche.ck.ClassTypeTest  Time elapsed: 0 s  <<< ERROR!
    java.lang.RuntimeException: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\class-types
    	at com.github.mauricioaniche.ck.ClassTypeTest.setUp(ClassTypeTest.java:19)
    Caused by: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\class-types
    	at com.github.mauricioaniche.ck.ClassTypeTest.setUp(ClassTypeTest.java:19)
    [INFO] Running com.github.mauricioaniche.ck.CouplingTest
    [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 s <<< FAILURE! - in com.github.mauricioaniche.ck.CouplingTest
    [ERROR] com.github.mauricioaniche.ck.CouplingTest  Time elapsed: 0 s  <<< ERROR!
    java.lang.RuntimeException: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\cbo
    	at com.github.mauricioaniche.ck.CouplingTest.setUp(CouplingTest.java:13)
    Caused by: java.nio.file.NoSuchFileException: C:\Users\Maykon%20Oliveira\Documents\Projects\ck\fixtures\cbo
    	at com.github.mauricioaniche.ck.CouplingTest.setUp(CouplingTest.java:13)
    

    Acontece que o caminho absoluto para a pasta, no meu ambiente, contem um espaço no meu nome de usuário do Windows, C:\Users\Maykon%20Oliveira\, e esse espaço é codificado para %20. Por conta disso, os arquivos não estavam sendo encontrados.

    Eu dei uma pesquisada para saber como resolver esse problema, e estou abrindo esse PR para você dar uma olhada e ver se faz sentido. Mas basicamente é só pegar o caminho para a pasta e decodificar em UTF-8.

    É importante verificar se esse problema esta acontecendo com outros usuários do CK, por que bastante gente usa, e ainda não foi relatado esse comportamento.

    opened by maykon-oliveira 0
  • NOC request

    NOC request

    Hi, I am using your software and i'm finding it very usefull but for it to have actually all ck metrics it should have also NOC and your old version that had it doesn't analyze the inner classes so it's not usable in combo with the newer version. Could you maybe reimplement it in the newer version so that it also does it for inner classes?

    opened by RiccardoBravin 0
  • Better names to anonymous classes

    Better names to anonymous classes

    Take the example of this real-world class: HectorPolicyManagerImpl, also in our repo.

    The method getAllPolicies declares an anonymous class in line 113. CK calls it net.retakethe.policyauction.data.impl.HectorPolicyManagerImpl$Anonymous1.

    That's too generic. Maybe a better name would be net.retakethe.policyauction.data.impl.HectorPolicyManagerImpl.getAllPolicies.filter$Anonymous1.

    opened by mauricioaniche 0
  • A coupling metric that only counts classes which the base class invokes a method

    A coupling metric that only counts classes which the base class invokes a method

    Hello,

    I find a conflict between your implementation of CBO and the definition of the original CK paper. In the paper, authors say "CBO for a class is a count of the number of other classes to which it is coupled where two classes are coupled if methods declared in one class use methods or instance variables defined by the other class."

    opened by aaghamohammadi 1
Owner
Maurício Aniche
Tech Academy Lead at Adyen and Assistant Professor in Software Engineering at TU Delft. Too practical for academia and too theoretical for companies.
Maurício Aniche
Time Series Metrics Engine based on Cassandra

Hawkular Metrics, a storage engine for metric data About Hawkular Metrics is the metric data storage engine part of Hawkular community. It relies on A

Hawkular 230 Dec 9, 2022
Java code generator for calling PL/SQL.

OBridge OBridge provides a simple Java source code generator for calling Oracle PL/SQL package procedures. Supported input, output parameters and retu

Ferenc Karsany 21 Oct 7, 2022
MixStack lets you connects Flutter smoothly with Native pages, supports things like Multiple Tab Embeded Flutter View, Dynamic tab changing, and more. You can enjoy a smooth transition from legacy native code to Flutter with it.

中文 README MixStack MixStack lets you connects Flutter smoothly with Native pages, supports things like Multiple Tab Embeded Flutter View, Dynamic tab

Yuewen Engineering 80 Dec 19, 2022
Get rid of the boilerplate code in properties based configuration.

OWNER OWNER, an API to ease Java property files usage. INTRODUCTION The goal of OWNER API is to minimize the code required to handle application confi

Matteo Baccan 874 Dec 31, 2022
H2 is an embeddable RDBMS written in Java.

Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; disk-based or in-memory

H2 Database Engine 3.6k Jan 5, 2023
A blazingly small and sane redis java client

Jedis Jedis is a blazingly small and sane Redis java client. Jedis was conceived to be EASY to use. Jedis is fully compatible with redis 2.8.x, 3.x.x

Redis 10.8k Dec 31, 2022
Elasticsearch Java Rest Client.

JEST Jest is a Java HTTP Rest client for ElasticSearch. ElasticSearch is an Open Source (Apache 2), Distributed, RESTful, Search Engine built on top o

Searchly 2.1k Jan 1, 2023
Java binding for etcd

jetcd: Java binding for etcd TravisCI: CircleCI: A simple Java client library for the awesome etcd Uses the Apache HttpAsyncClient to implement watche

Justin Santa Barbara 134 Jan 26, 2022
LINQ-style queries for Java 8

JINQ: Easy Database Queries for Java 8 Jinq provides developers an easy and natural way to write database queries in Java. You can treat database data

Ming Iu 641 Dec 28, 2022
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Dec 30, 2022
MariaDB Embedded in Java JAR

What? MariaDB4j is a Java (!) "launcher" for MariaDB (the "backward compatible, drop-in replacement of the MySQL(R) Database Server", see FAQ and Wiki

Michael Vorburger ⛑️ 720 Jan 4, 2023
Unified Queries for Java

Querydsl Querydsl is a framework which enables the construction of type-safe SQL-like queries for multiple backends including JPA, MongoDB and SQL in

Querydsl 4.1k Dec 31, 2022
requery - modern SQL based query & persistence for Java / Kotlin / Android

A light but powerful object mapping and SQL generator for Java/Kotlin/Android with RxJava and Java 8 support. Easily map to or create databases, perfo

requery 3.1k Jan 5, 2023
Speedment is a Stream ORM Java Toolkit and Runtime

Java Stream ORM Speedment is an open source Java Stream ORM toolkit and runtime. The toolkit analyzes the metadata of an existing SQL database and aut

Speedment 2k Dec 21, 2022
A blazingly small and sane redis java client

Jedis Jedis is a blazingly small and sane Redis java client. Jedis was conceived to be EASY to use. Jedis is fully compatible with redis 2.8.x, 3.x.x

Redis 10.9k Jan 8, 2023
jOOQ is the best way to write SQL in Java

jOOQ's reason for being - compared to JPA Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java

jOOQ Object Oriented Querying 5.3k Jan 4, 2023
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Jan 1, 2023
jdbi is designed to provide convenient tabular data access in Java; including templated SQL, parameterized and strongly typed queries, and Streams integration

The Jdbi library provides convenient, idiomatic access to relational databases in Java. Jdbi is built on top of JDBC. If your database has a JDBC driv

null 1.7k Dec 27, 2022