crnk.io - Crank up the development of RESTful applications

Overview

crnk.io - Crank up the development of RESTful applications!

Build Status Gitter License Coverage Status

Bintray release on jcenter
Bintray latest in private repository

What is Crnk?

Crnk is an implementation of the JSON API specification and recommendations in Java to facilitate building RESTful applications. It provides many conventions and building blocks that application can benefit from. This includes features such as sorting, filtering, pagination, requesting complex object graphs, sparse field sets, attaching links to data or atomically execute multiple operations. Further integration with frameworks and libraries such as Spring, CDI, JPA, Bean Validation, Dropwizard, Servlet API, Zipkin and and more ensure that JSON API plays well together with the Java ecosystem. Have a look at www.crnk.io and the documentation for more detailed information.

Release notes can be found in http://www.crnk.io/releases/.

Repository

Crnk Maven artifacts are available from jcenter/bintray: https://bintray.com/crnk-project.

Note that due to reliability issues of MavenCentral we only rarely publish there.

Requirements

Crnk requires Java 1.8 or later and an SLF4J setup for logging.

Example

See https://github.com/crnk-project/crnk-example/

Gradle settings.gradle can look like:

gradle.beforeProject { Project project ->
    project.with {
        buildscript {
            repositories {
                jcenter()
                // maven { url 'https://dl.bintray.com/crnk-project/mavenLatest/' }
            }
        }
        repositories {
            jcenter()
            // maven { url 'https://dl.bintray.com/crnk-project/mavenLatest/' }
        }
    }
}

and the build.gradle:

dependencies {
    implementation platform('io.crnk:crnk-bom:INSERT_VERSION_HERE')
    annotationProcessor platform('io.crnk:crnk-bom:INSERT_VERSION_HERE')

    annotationProcessor 'io.crnk:crnk-gen-java'

    implementation "io.crnk:crnk-setup-spring-boot2"
    implementation "io.crnk:crnk-data-jpa"
    implementation "io.crnk:crnk-data-facet"
    implementation "io.crnk:crnk-format-plain-json"
    implementation "io.crnk:crnk-validation"
    implementation "io.crnk:crnk-home"
    implementation "io.crnk:crnk-ui"
    implementation "io.crnk:crnk-operations"
    implementation "io.crnk:crnk-security"
}

and a basic Java example:

{ public Map votes = new ConcurrentHashMap<>(); public VoteRepository() { super(Vote.class); } @Override public ResourceList findAll(QuerySpec querySpec) { return querySpec.apply(votes.values()); } @Override public S save(S entity) { votes.put(entity.getId(), entity); return null; } @Override public void delete(UUID id) { votes.remove(id); } }">
@JsonApiResource(type = "vote")
@Data
public class Vote {

    @JsonApiId
    private UUID id;

    private int stars;

}

public class VoteRepository extends ResourceRepositoryBase
      
        {

    public Map
       
         votes = new ConcurrentHashMap<>();

    public VoteRepository() {
        super(Vote.class);
    }

    @Override
    public ResourceList
        
          findAll(QuerySpec querySpec) {
        return querySpec.apply(votes.values());
    }

    @Override
    public 
          S save(S entity) {
        votes.put(entity.getId(), entity);
        return null;
    }

    @Override
    public void delete(UUID id) {
        votes.remove(id);
    }
}

        
       
      

or with JPA:

roles = new ArrayList<>(); @Version private Integer version; } public class PersonRepository extends JpaEntityRepositoryBase { public PersonRepository() { super(PersonEntity.class); } @Override public PersonEntity save(PersonEntity entity) { // add your save logic here return super.save(entity); } @Override public PersonEntity create(PersonEntity entity) { // add your create logic here return super.create(entity); } @Override public void delete(UUID id) { // add your save logic here super.delete(id); } }">
@JsonApiResource(type = "person")
@Entity
@Data
public class PersonEntity {

	@Id
	private UUID id;

	private String name;

	private int year;

	@OneToMany(mappedBy = "movie")
	private List
      
        roles = new ArrayList<>();

	@Version
	private Integer version;
}

public class PersonRepository extends JpaEntityRepositoryBase
       
         {

	public PersonRepository() {
		super(PersonEntity.class);
	}

	@Override
	public PersonEntity save(PersonEntity entity) {
		// add your save logic here
		return super.save(entity);
	}

	@Override
	public PersonEntity create(PersonEntity entity) {
		// add your create logic here
		return super.create(entity);
	}

	@Override
	public void delete(UUID id) {
		// add your save logic here
		super.delete(id);
	}
}

       
      

Crnk integrates well with many frameworks. Have a look at the documentation and carefully choose what you need. Don't hesitate to ask for help and suggest improvements!

Licensing

Crnk is licensed under the Apache License, Version 2.0. You can grab a copy of the license at http://www.apache.org/licenses/LICENSE-2.0.

Building from Source

Crnk make use of Gradle for its build. To build the complete project run

gradlew clean build

Note as part of the build a local Node installation is downloaded to build the frontend parts (crnk-ui) of the project.

Links

Endorsements

YourKit

We thank YourKit for supporting open source projects with profiler and monitoring tooling.

Comments
  • question: how would i annotate a relation that i only want to lookup if included

    question: how would i annotate a relation that i only want to lookup if included

    For, example, let's say events have associated users. So, we have

    @JsonApiResource(type='events')
    public class EventResource {
      @JsonApiRelation(serialize = SerializeType.ONLY_ID)
      UserResource user
    }
    

    So, I want to be be able to say /events/1 to do a query against the events service, which gives us back events with a userId, so then the resulting json has relationships with { "data": { "id": "1", "type": "users" } }

    I also want to be able to say /events/1?include=user to do a query against the events service AND a query against the user service, so now i have a full user object to include, so a "included": [ { "id": "1", "type": "users", "attributes": {...} } ]

    Even if there was a LoopIncludeBehavior of Always call a relationship's findManyTargets or findOneTarget if the field is included, that wouldn't be quite right, because I actually want to utilize the userId that I already have off of the event object, almost like a /users/1 call, rather than do a query against the user service using the event id.

    Any thoughts on how the framework wants me to go about doing this?

    opened by jmchuster 21
  • Crnk 305 fix resource path ignored

    Crnk 305 fix resource path ignored

    This is the PR for the bug reported in https://github.com/crnk-project/crnk-framework/issues/305

    When pulling from master I started having some tests failing that were ok in the version before master, @remmeier is it possible you to help me a bit on fixing them? I'll continue to work a bit on them anyway but I don't have that much time.

    Thanks, Julio

    opened by julillosamaral 17
  • DefaultResourceInformationProvider: accept method must also check against the JsonApiResource.pagingBehavior attribute

    DefaultResourceInformationProvider: accept method must also check against the JsonApiResource.pagingBehavior attribute

    When building the ResourceInformation, the ModuleRegistry iterates through all the builders it has and takes the first builders that accepts the resourceClass. The fact is that the first builder is always (seems to be) the ResourceInformationProvider (DefaultResourceInformationProvider) that contains, as pagingBehavior the OffsetLimitPagingBehavior. The DefaultResourceInformationProvider, in the public boolean accept(Class<?> resourceClass) method must check, not only, if the resourceClass contains the JsonApiResource annotation but also if the pagingBehavior value/class of that annotation is in the pagingBehaviors Map.

    opened by daniel-deluca 17
  • QuerySpec's custom parameters

    QuerySpec's custom parameters

    I couldn't find any way to support custom parameters.. All interfaces depend on QuerySpec which is class i.e. one can't just use inheritance or implement his own implementation (if it was an interface for example). From other side, there is a QuerySpecDeserializer interface which might be overriden.. So question is what's the point of implementing your own deserializer if all of the repos are hardcoded to work with QuerySpec??

    What if we introduce a list of unsupported (and provided) query params as map or something.. This way one can override deserializer and have his custom fields accessable..

    opened by vicmosin 15
  • CrnkClient creates its own ObjectMapper instance

    CrnkClient creates its own ObjectMapper instance

    On the server you can freely configure your own ObjectMapper. However, CrnkClient creates its own ObjectMapper with "new" in the constructor. Therefore the mapping might work differently on client and server. This might even result in an exception when trying to deserialize a response from the server.

    Solution: Add an additional constructor in CrnkClient that uses an instance of an ObjectMapper.

    opened by d80harri 14
  • Empty attribute list if not fieldset is empty

    Empty attribute list if not fieldset is empty

    We are using crnk with spring boot, our requirement is to send empty attributes if no fieldset is passed in url. First of all is it possible in crnk, if not can somebody guid me in that direction. My first approach was creating a class that extend Resource Repository add logic to check fieldset based on QuerySpec and all my resource will extend this new class instead of ResourceRepository.

    I know this is very custom requirement, by default crank gives all attributes if no field-set is specified in url

    Thanks

    opened by yashprit 13
  • Wrong treatment of missing attributes

    Wrong treatment of missing attributes

    According to the docs:

    If a request does not include all of the attributes for a resource, the server MUST interpret the missing attributes as if they were included with their current values. The server MUST NOT interpret missing attributes as null values.

    which is actually crnk ignores and fills them with nulls. As a result, resource contains nulls in case of missing attributes -> values go to DB or any other place. So this behaviour obviously wrong from specifications perspective.

    ResourcePatch which is responsible for update action just removes the attributes which aren't in the request. I would like to fix it but not sure since it might be really a breaking change for ones who already use current logic.

    @remmeier any ideas whether it makes sense to fix and how to configure the backwards compatibility?

    opened by vicmosin 13
  • Support async programming

    Support async programming

    The topic has come up a number of times. Feel free to place your ideas here. The Java 9 Flow API and Completable futures would be two ideas. When designing async repository interfaces, one has to keep in mind that we not only deliver a stream of resources, but also meta and links information.

    help wanted 
    opened by remmeier 13
  • Resolve concrete types of type variables

    Resolve concrete types of type variables

    This is an attempt to advance #430 by resolving the concrete types of type variables at runtime.

    I got my JpaModule to initialize, however requests to the meta module still fail with the same exception as described in #430.

    opened by lorenzleutgeb 12
  • Alternative pagination is hard to use - should become the global default

    Alternative pagination is hard to use - should become the global default

    By now it should be possible to write your own implementation of PagingBehavior, which I did. However, my support for page[size] and page[number] is not really picked up well.

    My implementation is indeed used by crnk. It's a spring bean that crnk can get hold of via the nice ServiceDiscovery interface. But, crnk stops creating pagination links in the response after registering this behavior. The reason is rather complicated.

    The JsonApiResource annotation specifies that the default pagingBehavior is OffsetLimitPagingBehavior.class. When the ResourceInformation for a resource is created, the following happens: From the registered paging behaviors (only my custom one present), one is picked that matches the pagingBehavior of the annotated resources. see this change

    Since it's my registered custom pagination versus the default OffsetLimitPagingation, on the ResourceInformation the pagingBehavior is set to null. And finally this check stops crnk from writing any pagination links.

    I would have expected, that registering a custom pagination behavior ensures that this becomes the global default. That's not the case. I could go through all 80+ exposed resources and add the custom pagination behavior as desired behavior, but that ain't cool. In general, I'd want the same behavior for whole API. Maybe with the option to change it to something else where needed.

    @vicmosin would it be possible to make a custom pagination behavior the new default behavior for the entire API?

    opened by weaselmetal 12
  • Jax-rs integration doesn't work

    Jax-rs integration doesn't work

    Hello! I'm trying to setup very simple application:

    1. tomcat + jersey + weld-servlet (CDI implementation)
    2. crnk: core + cdi + rs + jpa
    3. Single JPA Entity: Address

    My Configuration is:

    @ApplicationPath("/api")
    public class CrnkDemoApplication extends Application {
        @Override
        public Set<Object> getSingletons() {
            CrnkFeature crnk = new CrnkFeature();
    
            JpaModuleConfig config = new JpaModuleConfig();
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            config.addRepository(
                    JpaRepositoryConfig.builder(Address.class).build());
            
            JpaModule jpaModule = JpaModule.createServerModule(
                    config,
                    sessionFactory.createEntityManager(),
                    new CdiTransactionRunner());
            
            crnk.addModule(jpaModule);
            return Collections.singleton(crnk);
        }
    }
    

    But my Entity doesn't exposed with http://localhost:8080/api/address. Under debugger I find that JsonApiRequestProcessor#process always create empty (null) JsonPath. What's wrong with my settings?

    opened by belovaf 12
  • Design question for chess-like game (get calculated attribute from request)

    Design question for chess-like game (get calculated attribute from request)

    Hello everyone, I have developed a chess game backend with crnk.io . Here I made a repository for games, players and moves. Everything works with the crnk annotations and repositories, but now I am in need of some additional functionality. I'd like to request all possible moves from the backend for the position in a certain game. What is the best way to go about this? I don't want to store this information, but like it to be a part of the game repository. So I'm guessing a custom parameter in the request and a meta object in the response? Unfortunately, I don't find any examples on how to achieve this ... Can someone give me some pointers?

    opened by MartenBE 0
  • Bump json5 and @angular/cli in /crnk-ui

    Bump json5 and @angular/cli in /crnk-ui

    Removes json5. It's no longer used after updating ancestor dependency @angular/cli. These dependencies need to be updated together.

    Removes json5

    Updates @angular/cli from 1.2.6 to 15.0.4

    Release notes

    Sourced from @​angular/cli's releases.

    v15.0.4

    15.0.4 (2022-12-14)

    @​angular-devkit/build-angular

    Commit Description
    fix - ccc8e0350 display actionable error when a style does not exist in Karma builder
    fix - 507f756c3 downlevel class private methods when targeting Safari <=v15
    fix - a0da91dba include sources in generated Sass source maps
    fix - 9fd356234 only set ngDevMode when script optimizations are enabled
    fix - 8e85f4728 update css-loader to 6.7.3
    fix - b2d4415ca update locale setting snippet to use globalThis.

    Special Thanks

    Alan Agius and Charles Lyding

    v15.0.3

    15.0.3 (2022-12-07)

    @​angular-devkit/build-angular

    Commit Description
    fix - 3d9971edb default preserve symlinks to Node.js value for esbuild
    fix - 24f4b51d2 downlevel class fields with Safari <= v15 for esbuild
    fix - 45afc42db downlevel class properties when targeting Safari <=v15
    fix - e6461badf prevent optimization adding unsupported ECMASCript features

    Special Thanks

    Charles Lyding, Dominic Elm and Paul Gschwendtner

    v15.0.2

    15.0.2 (2022-11-30)

    @​angular-devkit/build-angular

    Commit Description
    fix - 2891d5bc9 correctly set Sass quietDeps and verbose options

    @​ngtools/webpack

    Commit Description
    fix - d9cc4b028 elide unused type references

    Special Thanks

    Alan Agius and Juuso Valkeejärvi

    v15.0.1

    15.0.1 (2022-11-23)

    @​schematics/angular

    Commit Description
    fix - 48426852b show warning when a TS Config is not found during migrations

    @​angular/cli

    ... (truncated)

    Changelog

    Sourced from @​angular/cli's changelog.

    15.0.4 (2022-12-14)

    @​angular-devkit/build-angular

    Commit Type Description
    ccc8e0350 fix display actionable error when a style does not exist in Karma builder
    507f756c3 fix downlevel class private methods when targeting Safari <=v15
    a0da91dba fix include sources in generated
    9fd356234 fix only set ngDevMode when script optimizations are enabled
    8e85f4728 fix update css-loader to 6.7.3
    b2d4415ca fix update locale setting snippet to use globalThis.

    Special Thanks

    Alan Agius and Charles Lyding

    15.1.0-next.2 (2022-12-08)

    @​schematics/angular

    Commit Type Description
    5b18ce154 feat add guardType as an alias of implements in guard schematic
    49b313f27 fix add missing import for functional interceptor spec
    2f92fe7e5 fix add missing semicolon in functional guard/resolver/interceptor

    @​angular-devkit/build-angular

    Commit Type Description
    97716969c fix default preserve symlinks to Node.js value for esbuild
    cf2f30afc fix downlevel class fields with Safari <= v15 for esbuild
    25eaaa24b fix downlevel class properties when targeting Safari <=v15
    7a063238b fix explicitly send options to JS transformer workers
    ef99a68b4 fix prevent optimization adding unsupported ECMASCript features

    Special Thanks

    Alan Agius, Charles Lyding, Cédric Exbrayat, Dominic Elm, Doug Parker and Paul Gschwendtner

    15.0.3 (2022-12-07)

    ... (truncated)

    Commits
    • 8771258 release: cut the v15.0.4 release
    • 8e85f47 fix(@​angular-devkit/build-angular): update css-loader to 6.7.3
    • 9fd3562 fix(@​angular-devkit/build-angular): only set ngDevMode when script optimizati...
    • ccc8e03 fix(@​angular-devkit/build-angular): display actionable error when a style doe...
    • 507f756 fix(@​angular-devkit/build-angular): downlevel class private methods when targ...
    • b2d4415 fix(@​angular-devkit/build-angular): update locale setting snippet to use `glo...
    • a0da91d fix(@​angular-devkit/build-angular): include sources in generated
    • eb2a73a release: cut the v15.0.3 release
    • 3d9971e fix(@​angular-devkit/build-angular): default preserve symlinks to Node.js valu...
    • 24f4b51 fix(@​angular-devkit/build-angular): downlevel class fields with Safari <= v15...
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by google-wombot, a new releaser for @​angular/cli since your current version.


    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] 0
  • Not able to inject custom header in response

    Not able to inject custom header in response

    Hello,

    I am using ResourceRepositoryBase class and i have an use case to inject custom header in response. I have tried to implement HttpRequestContextAware interface in my repository class and added below code snippet in findAll() method, but i am not seeing the custom header in response. I couldn't find clear documentation to achieve this functionality.

    httpRequestContextProvider.getRequestContext().get response().setHeader("custom-header","custom-values");

    Could you please suggest and share some sample..

    Thanks in Advance!!

    opened by sans30 0
  • Support SpringBoot 3 with `jakarta` api

    Support SpringBoot 3 with `jakarta` api

    Currently crnk-setup-servlet are heavily based on javax.servlet api so it's not compatible with jakarta api at all. All the servlet filters are failed in Spring Boot 3.

    So any plan so migrate to the new jakarta API? I tried a little bit, but it seems to reweite all the crnk-setup-servlet and crnk-setup-spring-boot2 modules, which is too redundant for users.

    So hope the maintainer can add the support on the code side.

    opened by UkonnRa 3
  • Bump express from 4.15.3 to 4.18.2 in /crnk-ui

    Bump express from 4.15.3 to 4.18.2 in /crnk-ui

    Bumps express from 4.15.3 to 4.18.2.

    Release notes

    Sourced from express's releases.

    4.18.2

    4.18.1

    • Fix hanging on large stack of sync routes

    4.18.0

    ... (truncated)

    Changelog

    Sourced from express's changelog.

    4.18.2 / 2022-10-08

    4.18.1 / 2022-04-29

    • Fix hanging on large stack of sync routes

    4.18.0 / 2022-04-25

    ... (truncated)

    Commits

    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] 0
Releases(3.2.20200419165537)
Owner
null
RESTKit is a powerful toolkit for restful services development

RESTKit is a powerful toolkit for restful services development. This plugin is committed to enhancing development efficiency with useful

Mr.Hu 25 Dec 22, 2022
CUBA Platform is a high level framework for enterprise applications development

Java RAD framework for enterprise web applications Website | Online Demo | Documentation | Guides | Forum CUBA Platform is a high level framework for

CUBA Platform 1.3k Jan 1, 2023
Firefly is an asynchronous web framework for rapid development of high-performance web application.

What is Firefly? Firefly framework is an asynchronous Java web framework. It helps you create a web application Easy and Quickly. It provides asynchro

Alvin Qiu 289 Dec 18, 2022
A web MVC action-based framework, on top of CDI, for fast and maintainable Java development.

A web MVC action-based framework, on top of CDI, for fast and maintainable Java development. Downloading For a quick start, you can use this snippet i

Caelum 347 Nov 15, 2022
Development Driven Testing (DDT) lets you generate unit tests from a running application. Reproduce a bug, generate a properly mocked test

DDTJ: It kills bugs DDT is the flip side of TDD (Test-driven development). It stands for "Development Driven Tests". Notice that it doesn’t contradict

null 4 Dec 30, 2021
Vaadin 6, 7, 8 is a Java framework for modern Java web applications.

Vaadin Framework Vaadin allows you to build modern web apps efficiently in plain Java, without touching low level web technologies. This repository co

Vaadin 1.7k Jan 5, 2023
ZK is a highly productive Java framework for building amazing enterprise web and mobile applications

ZK ZK is a highly productive Java framework for building amazing enterprise web and mobile applications. Resources Documentation Tutorial ZK Essential

ZK 375 Dec 23, 2022
An evolving set of open source web components for building mobile and desktop web applications in modern browsers.

Vaadin components Vaadin components is an evolving set of high-quality user interface web components commonly needed in modern mobile and desktop busi

Vaadin 519 Dec 31, 2022
RESTEasy is a JBoss project that provides various frameworks to help you build RESTful Web Services and RESTful Java applications

RESTEasy RESTEasy is a JBoss.org project aimed at providing productivity frameworks for developing client and server RESTful applications and services

RESTEasy 1k Dec 23, 2022
RESTKit is a powerful toolkit for restful services development

RESTKit is a powerful toolkit for restful services development. This plugin is committed to enhancing development efficiency with useful

Mr.Hu 25 Dec 22, 2022
JHipster is a development platform to quickly generate, develop, & deploy modern web applications & microservice architectures.

Greetings, Java Hipster! Full documentation and information is available on our website at https://www.jhipster.tech/ Please read our guidelines befor

JHipster 20.2k Jan 5, 2023
LWJGL is a Java library that enables cross-platform access to popular native APIs useful in the development of graphics (OpenGL, Vulkan), audio (OpenAL), parallel computing (OpenCL, CUDA) and XR (OpenVR, LibOVR) applications.

LWJGL - Lightweight Java Game Library 3 LWJGL (https://www.lwjgl.org) is a Java library that enables cross-platform access to popular native APIs usef

Lightweight Java Game Library 4k Dec 29, 2022
Datumbox is an open-source Machine Learning framework written in Java which allows the rapid development of Machine Learning and Statistical applications.

Datumbox Machine Learning Framework The Datumbox Machine Learning Framework is an open-source framework written in Java which allows the rapid develop

Vasilis Vryniotis 1.1k Dec 9, 2022
LWJGL is a Java library that enables cross-platform access to popular native APIs useful in the development of graphics (OpenGL, Vulkan), audio (OpenAL), parallel computing (OpenCL, CUDA) and XR (OpenVR, LibOVR) applications.

LWJGL - Lightweight Java Game Library 3 LWJGL (https://www.lwjgl.org) is a Java library that enables cross-platform access to popular native APIs usef

Lightweight Java Game Library 4k Dec 29, 2022
CUBA Platform is a high level framework for enterprise applications development

Java RAD framework for enterprise web applications Website | Online Demo | Documentation | Guides | Forum CUBA Platform is a high level framework for

CUBA Platform 1.3k Jan 1, 2023
JHipster is a development platform to quickly generate, develop, & deploy modern web applications & microservice architectures.

Greetings, Java Hipster! Full documentation and information is available on our website at https://www.jhipster.tech/ Please read our guidelines befor

JHipster 20.2k Jan 5, 2023
Nrich is a Java library developed at CROZ whose purpose is to make development of applications on JVM a little easier.

nrich Nrich is a Java library developed at CROZ whose purpose is to make development of applications on JVM a little easier. It contains modules that

CROZ 44 Nov 12, 2022
Rails like error pages for Spring Boot applications that are only active in development.

Better Error Pages Table of Contents Introduction Demo Quick Start Configuration Limitations License Introduction This is a Spring Boot Starter projec

Kod Gemisi 13 Jan 2, 2022
JHipster Lite ⚡ is a development platform to generate, develop & deploy modern web applications & microservice architectures, step by step.

JHipster Lite ⚡ Description JHipster is a development platform to quickly generate, develop & deploy modern web applications & microservice architectu

JHipster 255 Jan 3, 2023