Diff Utils library is an OpenSource library for performing the comparison / diff operations between texts or some kind of data: computing diffs

Overview

java-diff-utils

Status

Build Status

Build Status using Github Actions

Codacy Badge

Maven Central

Intro

Diff Utils library is an OpenSource library for performing the comparison operations between texts: computing diffs, applying patches, generating unified diffs or parsing them, generating diff output for easy future displaying (like side-by-side view) and so on.

Main reason to build this library was the lack of easy-to-use libraries with all the usual stuff you need while working with diff files. Originally it was inspired by JRCS library and it's nice design of diff module.

This is originally a fork of java-diff-utils from Google Code Archive.

API

Javadocs of the actual release version: JavaDocs java-diff-utils

Examples

Look here to find more helpful informations and examples.

These two outputs are generated using this java-diff-utils. The source code can also be found at the Examples page:

Producing a one liner including all difference information.

This is a test senctencefor diffutils.

Producing a side by side view of computed differences.

original new
This is a test senctence. This is a test for diffutils.
This is the second line. This is the second line.
And here is the finish.

Main Features

  • computing the difference between two texts.
  • capable to hand more than plain ascii. Arrays or List of any type that implements hashCode() and equals() correctly can be subject to differencing using this library
  • patch and unpatch the text with the given patch
  • parsing the unified diff format
  • producing human-readable differences
  • inline difference construction
  • Algorithms:
    • Meyers Standard Algorithm
    • Meyers with linear space improvement
    • HistogramDiff using JGit Library

Algorithms

  • Meyer's diff
  • HistogramDiff

But it can easily replaced by any other which is better for handing your texts. I have plan to add implementation of some in future.

Source Code conventions

Recently a checkstyle process was integrated into the build process. java-diff-utils follows the sun java format convention. There are no TABs allowed. Use spaces.

public static <T> Patch<T> diff(List<T> original, List<T> revised,
    BiPredicate<T, T> equalizer) throws DiffException {
    if (equalizer != null) {
        return DiffUtils.diff(original, revised,
        new MyersDiff<>(equalizer));
    }
    return DiffUtils.diff(original, revised, new MyersDiff<>());
}

This is a valid piece of source code:

  • blocks without braces are not allowed
  • after control statements (if, while, for) a whitespace is expected
  • the opening brace should be in the same line as the control statement

To Install

Just add the code below to your maven dependencies:

<dependency>
    <groupId>io.github.java-diff-utilsgroupId>
    <artifactId>java-diff-utilsartifactId>
    <version>4.9version>
dependency>

or using gradle:

// https://mvnrepository.com/artifact/io.github.java-diff-utils/java-diff-utils
implementation "io.github.java-diff-utils:java-diff-utils:4.5"
Comments
  • Support Hierarchy

    Support Hierarchy

    Expected Behavior

    We need support for generating tree like diffs. Similar to a file system diff where you have folders compared as well as files. In our case, we have groups of groups and we currently create separate diffs for each group. Having hierarchy support will enable us to create a single unified diff for the customer.

    Actual Behavior

    Hierarchy not supported

    Specifications

    • Version: 4.0
    • Platform: Win/Linux
    • Subsystem:
    opened by yairogen 25
  • [Feature request] Consider making project modular

    [Feature request] Consider making project modular

    It's nice to have zero-dependency implementations. I think it's possible to split library into 2 or modules:

    diff-utils-core
    diff-utils-myers
    diff-utils-jgit
    

    or (just moving jgit dependency out of core library):

    diff-utils
    diff-utils-jgit
    
    opened by dector 14
  • UnifiedDiffParserException on apparently sane file (2nd variant)

    UnifiedDiffParserException on apparently sane file (2nd variant)

    Describe the bug UnifiedDiffReader.parseUnifiedDiff throws UnifiedDiffParserException on a patch which apparently looks good:

    https://raw.githubusercontent.com/bazelbuild/bazel/master/third_party/aws-sdk-auth-lite/patches-vs-1.11.297/01-bazel-strip-unused.patch

    To Reproduce Run this program:

    String patch = new Scanner(new URL(
        "https://raw.githubusercontent.com/bazelbuild/bazel/master/third_party/aws-sdk-auth-lite/patches-vs-1.11.297/01-bazel-strip-unused.patch"
    ).openStream(), "UTF-8").useDelimiter("\\A").next();
    
    UnifiedDiffReader.parseUnifiedDiff(new StringBufferInputStream(patch));
    

    Expected behavior

    No Exceptions.

    Actual behavior

    Dec 14, 2020 9:49:46 PM com.github.difflib.unifieddiff.UnifiedDiffReader processLine WARNING: >>> no rule matched \ No newline at end of file Exception in thread "main" com.github.difflib.unifieddiff.UnifiedDiffParserException: expected file start line not found at com.github.difflib.unifieddiff.UnifiedDiffReader.parse(UnifiedDiffReader.java:95) at com.github.difflib.unifieddiff.UnifiedDiffReader.parseUnifiedDiff(UnifiedDiffReader.java:146) ...

    System

    • Java version: openjdk-11
    • Version: 4.9

    Notes

    :wave: java-diff-utils maintainers again! Here is another corner case I found. The patch comes from the Bazel project, so once again it's OK to include in tests.

    bug 
    opened by moio 13
  • List<String> generated from ResultSet show inconsistent marks as a List<String> written by hand

    List generated from ResultSet show inconsistent marks as a List written by hand

    Expected Behavior

    ResultSet from JDBC converted into Strings and then added to a List should show the same differences as a List = Arrays.asList() created by hand.

    When using this (entered by hand)

    List<String> listOne = Arrays.asList("MASS_TABLE,ID,NUMBER,22,N,", "MASS_TABLE,ISSUEID,NUMBER,22,Y,", "MASS_TABLE,MODIFIED,NUMBER,22,Y,", "MASS_TABLE,SYSTEMNAME,VARCHAR2,1020,Y,");
    List<String> listTwo = Arrays.asList("ATOM_TABLE,ID,NUMBER,22,N,", "ATOM_TABLE,ISSUEID,NUMBER,22,Y,", "ATOM_TABLE,MODIFIED,NUMBER,22,Y,", "ATOM_TABLE,ACRONYM,VARCHAR2,255,Y," );
    

    You will get this when ran through the DiffGenerator:

    |~MASS_TABLE~,ID,NUMBER,22,N, | **ATOM_TABLE**,ID,NUMBER,22,N,|
    |~MASS_TABLE~,ISSUEID,NUMBER,22,Y, | **ATOM_TABLE**,ISSUEID,NUMBER,22,Y,|
    |~MASS_TABLE~,MODIFIED,NUMBER,22,Y, | **ATOM_TABLE**,MODIFIED,NUMBER,22,Y,|
    |~MASS_TABLE~,~SYSTEMNAME~,VARCHAR2,~1020~,Y, | **ATOM_TABLE**,**ACRONYM**,VARCHAR2,**255**,Y,|
    

    Actual Behavior

    DiffGenerator shows apparently incorrect results.

    Example:

    ("NUMBER" on the first row, and "VARCHAR" on the last row show marks ("**") in front of the word to indicate the difference, but don't show the corresponding marks behind it). Also, as the results go further, some differences will be marked on the first list and no corresponding marks will be shown at all on the second list.

    | ~MASS_TABLE~,ID,NUMBER,22,N, | **ATOM_TABLE**,**ID**,**NUMBER,22,N, |
    | ~MASS_TABLE~,ISSUEID,NUMBER,22,Y, | ATOM_TABLE,ISSUEID,NUMBER,22,Y, |
    | ~MASS_TABLE~,MODIFIED,NUMBER,22,Y, | ATOM_TABLE,MODIFIED,NUMBER,22,Y, |
    | ~MASS_TABLE~,SYSTEMNAME,VARCHAR2,~1020~,Y, | ATOM_TABLE,ACRONYM,**VARCHAR2,**255**,Y, |
    

    Steps to Reproduce the Problem

    1.Connect to two different Oracle Databases and run a SQL query, saving information as text from ResultSet into different List 2.Compare the two Lists in the DiffGenerator 3.Compare these results to the results when the information is put in by hand and compared using DiffGenerator.

    Shows as expected:

      List<String> listOne = Arrays.asList("MASS_TABLE,ID,NUMBER,22,N,", "MASS_TABLE,ISSUEID,NUMBER,22,Y,", "MASS_TABLE,MODIFIED,NUMBER,22,Y,", "MASS_TABLE,SYSTEMNAME,VARCHAR2,1020,Y,");
            List<String> listTwo = Arrays.asList("ATOM_TABLE,ID,NUMBER,22,N,", "ATOM_TABLE,ISSUEID,NUMBER,22,Y,", "ATOM_TABLE,MODIFIED,NUMBER,22,Y,", "ATOM_TABLE,ACRONYM,VARCHAR2,255,Y," );
    
            DiffRowGenerator generator = DiffRowGenerator.create()
                    .showInlineDiffs(true)
                    .inlineDiffByWord(true)
                    .oldTag(f -> "~")
                    .newTag(f -> "**") 
                    .build();
    
            List<DiffRow> diffRowList;
    
            try {
                diffRowList = generator.generateDiffRows(listOne, listTwo);
    
                for (DiffRow diffRow : diffRowList) {
                    System.out.println("|" + diffRow.getOldLine() + "|" + diffRow.getNewLine() + "|");
                }
            } catch (DiffException e) {
                e.printStackTrace();
            }
    

    Does not show as expected, using database:

    ...
      List<String> databaseSchemaList = new ArrayList<>();
            try {
                conn = DBHelper.getConnection(databaseName);
                stmt = Objects.requireNonNull(conn).createStatement();
                rs = stmt.executeQuery(query);
    
                while (rs.next()) {
                    int columnCount = rs.getMetaData().getColumnCount();
                    StringBuilder rsStringBuilder = new StringBuilder();
                    for (int i = 1; i <= columnCount; i++) {
                        Object rsObject = rs.getObject(i);
                        String rsString = (rsObject == null) ? "NULL" : rsObject.toString();
                        rsStringBuilder.append(rsString).append(",");
                    }         
                    databaseSchemaList.add(rsStringBuilder.toString());
                }
           
            } catch (Exception e) {
                e.printStackTrace();
            } finally {     
                ...
            }
            return databaseSchemaList;   
        }
    
        private void getComparisonResults(List<String> listOne, List<String> listTwo) {
    
            DiffRowGenerator generator = DiffRowGenerator.create()
                    .showInlineDiffs(true)
                    .inlineDiffByWord(true)
                    .oldTag(f -> "~") 
                    .newTag(f -> "**")
                    .build();
    
            List<DiffRow> diffRowList;
    
            try {
                diffRowList = generator.generateDiffRows(listOne, listTwo);
    
                for (DiffRow diffRow : diffRowList) {
                    System.out.println("| " + diffRow.getOldLine() + " | " + diffRow.getNewLine() + " |");
                }
          ...
    }
    
     public static void main(String[] args) {
    
            SchemaComparison schemaComparison = new SchemaComparison();
    
            //get list from each database
            List<String> aSchemaList = schemaComparison.getDatabaseSchemaList(DatabaseName.A);
            List<String> bSchemaList = schemaComparison.getDatabaseSchemaList(DatabaseName.B);
    
           //run comparison
            schemaComparison.getComparisonResults(aSchemaList,bSchemaList);
    
        }
    
    

    Specifications

    • Version: 2.3 SNAPSHOT
    • Platform: Windows 7
    • Subsystem: Oracle Database 11g, IntelliJ 2018.1
    opened by akon89 13
  • Bump checkstyle from 8.18 to 8.29

    Bump checkstyle from 8.18 to 8.29

    Bumps checkstyle from 8.18 to 8.29.

    Release notes

    Sourced from checkstyle's releases.

    checkstyle-8.29

    https://checkstyle.org/releasenotes.html#Release_8.29

    checkstyle-8.28

    https://checkstyle.org/releasenotes.html#Release_8.28

    checkstyle-8.27

    https://checkstyle.org/releasenotes.html#Release_8.27

    checkstyle-8.26

    https://checkstyle.org/releasenotes.html#Release_8.26

    checkstyle-8.25

    https://checkstyle.org/releasenotes.html#Release_8.25

    checkstyle-8.24

    https://checkstyle.org/releasenotes.html#Release_8.24

    checkstyle-8.23

    https://checkstyle.org/releasenotes.html#Release_8.23

    checkstyle-8.22

    https://checkstyle.org/releasenotes.html#Release_8.22

    checkstyle-8.21

    https://checkstyle.org/releasenotes.html#Release_8.21

    checkstyle-8.20

    https://checkstyle.org/releasenotes.html#Release_8.20

    checkstyle-8.19

    https://checkstyle.org/releasenotes.html#Release_8.19

    Commits
    • 8933d03 [maven-release-plugin] prepare release checkstyle-8.29
    • bd45909 Issue #7487: refactor code to use DetailAST.hasChildren()
    • 317e51f Issue #7487: add method hasChildren() to DetailAST
    • 89b4dcd Issue #3238: Java 8 Grammar: annotations on arrays and varargs
    • 252cd89 dependency: bump junit-pioneer from 0.5.1 to 0.5.2
    • 2ee2615 dependency: bump junit.version from 5.5.2 to 5.6.0
    • 4ed7cb8 minor: add space before xml comment end '-->' to ease reading and make links ...
    • c46a16d Issue #7468: disable 'external-parameter-entities' feature by default
    • dfed794 minor: add missing test case to SuperCloneCheckTest
    • 24e7bdf dependency: bump antlr4.version from 4.7.2 to 4.8-1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 11
  • DiffRowGenerator replaces < and >

    DiffRowGenerator replaces < and >

    Expected Behavior

    DiffRowGenerator would leave < and > the way they are

    Actual Behavior

    DiffRowGenerator replaces < and > with their html entities.

    Steps to Reproduce the Problem

    1. Run DiffRowGenerator.create().generateDiffRows(List.of("<"), List.of("<"))
    2. Observe that the resulting String has &lt; instead of <

    Specifications

    • Version: 4.0
    • Platform: Linux
    • Subsystem:

    Using reportLinesUnchanged is not an option since that means tags are missing if an entire line is added/deleted. Having something like replaceSomeHTMLEntities with default true but optionally disableable would be nice, or being able to supply a general string normalisation function.

    If needed/wanted I can PR this.

    opened by JoJoDeveloping 11
  • Problem with using 4.4 in modularized project (cannnot determine module name)

    Problem with using 4.4 in modularized project (cannnot determine module name)

    Describe the bug Update to 4.4 in our JabRef (modularized application) fails. Gradle complains about the module name:

    cannot determine module name for /home/travis/.gradle/caches/modules-2/files-2.1/io.github.java-diff-utils/java-diff-utils/4.4/87ebb16140d120da919b62117865954da06981b6/java-diff-utils-4.4.jar
    /home/travis/build/JabRef/jabref/src/main/java/org/jabref/gui/mergeentries/DiffHighlighting.java:10: error: package com.github.difflib does not exist
    
    import com.github.difflib.DiffUtils;
    

    To Reproduce Use the 4.4 in a modularized java project For reference, this is the PR which is failing: https://github.com/JabRef/jabref/pull/5594

    I tried also to add the parent as well:

     compile 'io.github.java-diff-utils:java-diff-utils-parent:4.4'
      compile 'io.github.java-diff-utils:java-diff-utils:4.4'
    

    Expected behavior No errors

    System

    • Java version 13
    • Version 4.4
    bug 
    opened by Siedlerchr 9
  • Get list of lines that are common between source and patch

    Get list of lines that are common between source and patch

    I am trying to iterate through the deltas =, however I would like to get list of lines that are common between the two sets of List by checking if (delta.getType() == DeltaType.EQUAL) { }

    However I am not able to see how to get this. The JUnit code and test examples do not show this examples. Please help?

    opened by xbotuk 9
  • Potential optimizations

    Potential optimizations

    Hi,

    I have moved from the initial Google diff project to this one as I prefer the package naming convention and the class refactoring. Also thank you for maintaining this library.

    The Myers’s algorithm is considered the best for Diff calculation, however it has complexity O(NR) and relies on matrices in order to evaluate all the possibilities.

    It is not adapted for large files and has performance issues.

    1. A possible first improvement could be to reduce the size of the 2 input string, by removing the common sequence at the start and at the end.

    Example: Identify the initial common prefix: org.apache.commons.lang.StringUtils.getCommonPrefix(…) Identify the final common prefix (reverse the string and get common prefix): org.apache.commons.lang.StringUtils.reverse(…) org.apache.commons.lang.StringUtils.getCommonPrefix(…)

    Once the Delta are calculated, you could restore the initial and final Delta. (positions of existing Deltas need to be adjusted with the first common Delta)

    1. Another possible improvement could be to identify the longest common subsequence (ex: org.apache.commons.text.similarity.LongestCommonSubsequence) and to split the Strings according to this value. Then calculate the Delta on the splitted strings and aggregate them at the end by adjusting the positions and also adding the common longest Delta.

    Optimization 1 and 2 can be applied in the same time.

    Many thanks, Guillaume

    Below an interesting post for potential improvements: https://denisbider.blogspot.com/2019/11/a-better-sliding-matrix-diff-algorithm.html

    opened by Guillaume789 8
  • Post-processing cleanup

    Post-processing cleanup

    https://neil.fraser.name/writing/diff/ section 3 mentions post-processing cleanup that https://github.com/google/diff-match-patch applies to the output. Does your library provide something similar?

    opened by cowwoc 8
  • Support for File Creation

    Support for File Creation

    Hi there, I ran into a problem when I tried to create a unified diff for the creation of a new file, which seams not to be supported by your library right now.

    As far as I can see, this feature is very easy to implement and could help others as well.

    It requires just a small change in the UnifiedDiffUtils.processDeltas() method, some changes in the method signatures to get the info about the new File creation into the methods and maybe another method to keep calls to old method signature running with default values.

    Actually it just those few lines in the main logic that could cover file creation:

    if (createNewFile) {
                origStart = 0; // the 0 here will trigger the creation of the new file
     } else {
                origStart = curDelta.getSource().getPosition() + 1 - contextSize;
                // NOTE: +1 to overcome the 0-offset Position
                if (origStart < 1) {
                    origStart = 1;
                }
     }
    

    Cheers, Eva

    opened by Pumuckline83 8
  • Request: Include simple copy-paste snippets in README.md

    Request: Include simple copy-paste snippets in README.md

    It requires significant digging to figure out how to use the library to generate a simple textual diff between two strings. I suggest adding a handful of example code snippets to the README.md file rather than directing readers to the wiki, which itself redirects to the not particularly compelling examples page.

    The examples on the examples page would be more compelling if they included the input and outputs of the snippets.

    opened by reddaly 2
  • Applying patches with hunks followed by contents fails

    Applying patches with hunks followed by contents fails

    In short, java-diff-utils assumes that a hunk is a line on its own. I'm parsing the output of git log -p that produces "inline" hunks like that: @@ -4,6 +4,9 @@ import com.github.javaparser.JavaParser; and that is not supported. I have no idea that format is OK with the unidiff specifications but the change to support that hunk format seems minimal.

    opened by DavideRossi 1
  • Setting log levels

    Setting log levels

    I am trying to parse a rather large diff file with UnifiedDiff udf = UnifiedDiffReader.parseUnifiedDiff(diff);

    It is choking on the file and giving me the error message:

    Jul 28, 2022 12:52:33 AM com.github.difflib.unifieddiff.UnifiedDiffReader processLine
    WARNING:   >>> no rule matched 
    Exception in thread "main" com.github.difflib.unifieddiff.UnifiedDiffParserException: expected file start line not found
    	at com.github.difflib.unifieddiff.UnifiedDiffReader.parse(UnifiedDiffReader.java:120)
    	at com.github.difflib.unifieddiff.UnifiedDiffReader.parseUnifiedDiff(UnifiedDiffReader.java:191)
    

    The source code shows that the "no rule matched" line is supposed to include the offending line, but in this case that is an empty line. Naturally I want to turn on some finer logging to show some context of the previous lines so I can find the bad line in my diff file. How do I do that?

    BTW the error message could be greatly improved by including the line number.

    opened by augustd 1
  • Performance Very Poor Compared to Unix Diff Tool

    Performance Very Poor Compared to Unix Diff Tool

    Describe the bug I would expect an implementation of the Myers diff algorithm to behave (at least asymptotically) equal. Unfortunately, this is not the case for this implementation: Starting with ~100k lines that are compared, the time consumption growth heavily (at least more than linear).

    You can see this in the following graph:

    grafik

    To Reproduce Steps to reproduce the behavior:

    1. Use https://github.com/DaGeRe/diff-benchmark (which contains 414ae6.zip and afdedc.zip which contain data that can be compared)
    2. Run [runJavaDiff.sh](https://github.com/DaGeRe/diff-benchmark/blob/main/java-difflib-benchmark/runJavaDiff.sh) and runBashDiff.sh to obtain the measurement values.
    3. Copy the measurement data and execute plot.plt to obtain the graph.

    Expected behavior The duration of the diff execution should grow linear with count of analyzed lines.

    System

    • Java version 1.8
    • Version 4.11
    opened by DaGeRe 2
  • Performance Very Poor When Using LinkedList

    Performance Very Poor When Using LinkedList

    Describe the bug When comparing two LinkedList-Instances, the performance is very poor. I compared ~1,1 million lines, and VisualVM showed me that several minutes where spent at https://github.com/java-diff-utils/java-diff-utils/blob/bc65f9703c137b3a7d2906eeaf064588dd36c125/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MeyersDiff.java#L115. With an ArrayList, this was reduced to a few seconds.

    From my point of view, there are two possible solutions:

    1. Create a benchmark, refactor this from .get to Iterator-usages and check whether this improves the performance by the benchmark
    2. Change to always require ArrayList instead just List, and document this in generateDiffRows to the end users.

    To Reproduce I'll create a benchmark if someone would try to refactor .get to Iterator-usages.

    Expected behavior This should either run fast or it should be clear that an ArrayList is required.

    System

    • Java version 1.8, but should happen with every version
    • Version 4.11
    opened by DaGeRe 3
Releases(java-diff-utils-parent-4.12)
AWS Lambda Performance comparison

aws-lambda-runtimes-performance AWS Lambda Performance comparison The full analyze is here https://filia-aleks.medium.com/benchmarking-all-aws-lambda-

Aleksandr Filichkin 87 Dec 11, 2022
Android developers should collect the following utils

README of Chinese About AndroidUtilCode ?? is a powerful & easy to use library for Android. This library encapsulates the functions that commonly used

Blankj 31.7k Jan 3, 2023
Commons networking related utils.

commons-networking Commons networking related utils. Note: This is not an official Cisco product. Features SSE (Server-sent Events) client GNMI Utils

Cisco Systems Engineers 6 Dec 22, 2022
Dex : The Data Explorer -- A data visualization tool written in Java/Groovy/JavaFX capable of powerful ETL and publishing web visualizations.

Dex Dex : The data explorer is a powerful tool for data science. It is written in Groovy and Java on top of JavaFX and offers the ability to: Read in

Patrick Martin 1.3k Jan 8, 2023
A Parser tool which actually tries to convert XML data into JSON data

SpringBoot A Parser tool which actually tries to convert XML data into JSON data Tools Required Postman (Testing API's) IDE - Eclipse / NetBeans/ Inte

null 1 Jan 27, 2022
Embulk: Pluggable Bulk Data Loader.

What's Embulk? Embulk is a parallel bulk data loader that helps data transfer between various storages, databases, NoSQL and cloud services. Embulk su

Embulk 1.7k Jan 6, 2023
Utility for developers and QAs what helps minimize time wasting on writing the same data for testing over and over again. Made by Stfalcon

Stfalcon Fixturer A Utility for developers and QAs which helps minimize time wasting on writing the same data for testing over and over again. You can

Stfalcon LLC 31 Nov 29, 2021
🌏🎮 Integrate data provided from Minecraft server with Web API.

MCWebIntegration ?? ?? Integrate data provided from Minecraft server with Web API.

yude 2 Oct 14, 2021
An open-source Java library for Constraint Programming

Documentation, Support and Issues Contributing Download and installation Choco-solver is an open-source Java library for Constraint Programming. Curre

null 607 Jan 3, 2023
Java rate limiting library based on token/leaky-bucket algorithm.

Java rate-limiting library based on token-bucket algorithm. Advantages of Bucket4j Implemented on top of ideas of well known algorithm, which are by d

Vladimir Bukhtoyarov 1.7k Jan 8, 2023
A Java library for designing good error messages

JDoctor, a Java library for good error messages Designing good error messages is hard. In Java, most often, developers just rely on throwing exception

Cédric Champeau 125 Oct 24, 2022
Discord4J is a fast, powerful, unopinionated, reactive library to enable quick and easy development of Discord bots for Java, Kotlin, and other JVM languages using the official Discord Bot API.

Discord4J is a fast, powerful, unopinionated, reactive library to enable quick and easy development of Discord bots for Java, Kotlin, and other JVM languages using the official Discord Bot API.

null 1.5k Jan 4, 2023
Ta4j is an open source Java library for technical analysis

Ta4j is an open source Java library for technical analysis. It provides the basic components for creation, evaluation and execution of trading strategies.

null 1.7k Dec 31, 2022
archifacts is a library to extract your architectural concepts out of your application's code

archifacts is a free (Apache 2.0 license) library for describing and detecting architectural building blocks and their relationships in your Java appl

null 45 Nov 29, 2022
hella-html is a library that makes it hella easy to generate dynamic HTML in vanilla Java.

Hella easy HTML in Java hella-html is a library that makes it hella easy to generate dynamic HTML in vanilla Java. Very lightweight and fast, the prim

null 1 Nov 23, 2022
documents4j is a Java library for converting documents into another document format

documents4j is a Java library for converting documents into another document format. This is achieved by delegating the conversion to any

documents4j 455 Dec 23, 2022
A Java API for checking if text contains profanity via the alt-profanity-checker Python library.

ProfanityCheckerAPI A Java API for checking if text contains profanity via the alt-profanity-checker Python library. It uses jep to run and interpret

William 2 Feb 19, 2022
High performance I/O library for Java using io_uring under the hood

nio_uring nio_uring is an I/O library for Java that uses io_uring under the hood, which aims to be: A simple and flexible API Super fast and efficient

Blake Beaupain 65 Dec 18, 2022
Comparison between Java and Common Lisp solutions to a phone-encoding problem described by Prechelt

Prechelt Phone Number Encoding This project implements the phone number encoding described by Lutz Prechelt in his article for the COMMUNICATIONS OF T

Renato Athaydes 27 Nov 30, 2021
Roman Beskrovnyi 250 Jan 9, 2023