Java 1-15 Parser and Abstract Syntax Tree for Java, including preview features to Java 13

Overview

JavaParser

Maven Central Build Status Coverage Status Join the chat at https://gitter.im/javaparser/javaparser License LGPL-3/Apache-2.0 DOI

This project contains a set of libraries implementing a Java 1.0 - Java 14 Parser with advanced analysis functionalities. This includes preview features to Java 13, with Java 14 preview features work-in-progress.

Our main site is at JavaParser.org

Setup

The project binaries are available in Maven Central.

We strongly advise users to adopt Maven, Gradle or another build system for their projects. If you are not familiar with them we suggest taking a look at the maven quickstart projects (javaparser-maven-sample, javasymbolsolver-maven-sample).

Just add the following to your maven configuration or tailor to your own dependency management system.

Please refer to the Migration Guide when upgrading from 2.5.1 to 3.0.0+

Maven:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-symbol-solver-core</artifactId>
    <version>3.20.0</version>
</dependency>

Gradle:

implementation 'com.github.javaparser:javaparser-symbol-solver-core:3.20.0'

Since Version 3.5.10, the JavaParser project includes the JavaSymbolSolver. While JavaParser generates an Abstract Syntax Tree, JavaSymbolSolver analyzes that AST and is able to find the relation between an element and its declaration (e.g. for a variable name it could be a parameter of a method, providing information about its type, position in the AST, ect).

Using the dependency above will add both JavaParser and JavaSymbolSolver to your project. If you only need the core functionality of parsing Java source code in order to traverse and manipulate the generated AST, you can reduce your projects boilerplate by only including JavaParser to your project:

Maven:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-core</artifactId>
    <version>3.20.0</version>
</dependency>

Gradle:

implementation 'com.github.javaparser:javaparser-core:3.20.0'

Since version 3.6.17 the AST can be serialized to JSON. There is a separate module for this:

Maven:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-core-serialization</artifactId>
    <version>3.20.0</version>
</dependency>

Gradle:

implementation 'com.github.javaparser:javaparser-core-serialization:3.20.0'

How To Compile Sources

If you checked out the project from GitHub you can build the project with maven using:

mvn clean install

If you checkout the sources and want to view the project in an IDE, it is best to first generate some of the source files; otherwise you will get many compilation complaints in the IDE. (mvn clean install already does this for you.)

mvn javacc:javacc

If you modify the code of the AST nodes, specifically if you add or remove fields or node classes, the code generators will update a lot of code for you. The run_metamodel_generator.sh script will rebuild the metamodel, which is used by the code generators which are run by run_core_generators.sh Make sure that javaparser-core at least compiles before you run these.

Note: for Eclipse IDE follow the steps described in the wiki: https://github.com/javaparser/javaparser/wiki/Eclipse-Project-Setup-Guide

More information

JavaParser.org is the main information site.

License

JavaParser is available either under the terms of the LGPL License or the Apache License. You as the user are entitled to choose the terms under which adopt JavaParser.

For details about the LGPL License please refer to LICENSE.LGPL.

For details about the Apache License please refer to LICENSE.APACHE.

Comments
  • issue124: initial implementation of Lexical Preservation

    issue124: initial implementation of Lexical Preservation

    Initial work on Lexical Preservation.

    I started cleaning up my experiment and move to using tokens. My experiment had more code and several tests, I have removed them for now to start from something cleaner.

    The next steps will be to write some tests and build from there.

    In this way we can discuss and see how work proceed.

    opened by ftomassetti 66
  • License under an Apache license

    License under an Apache license

    GPL and LGPL licensed libraries is often problematic when integrating in other projects. Could it be possible to also license the project under the Apache license, or even MIT / BSD?

    Improvement 
    opened by glaforge 60
  • Issue 1154 - Bridging JP & JSS

    Issue 1154 - Bridging JP & JSS

    This thing snowballed... basically I brought declarations & types interfaces from JSS.

    We have the concept of "ResolvedDeclarations" and "ResolvedTypes". ResolvedDeclarations can be obtained by JP declarations or by class files or through reflection.

    How do we get a ResolvedDeclaration from a JP Declaration? Calling the resolve method. This resolve method will look into the data map of the node for a SymbolResolver which will do the mapping.

    Similarly we have ResolvedTypes, which have more features. They can also be obtained from JP type in the same way (calling the resolve method).

    It is larger than expected but it compiles at least and it would probably be more obvious to use. Also, it would remove some names confusion (basically JSS stuff is prefixed with "Resolved").

    What do you guys think?

    opened by ftomassetti 36
  • Support for Java 9 project Jigsaw module-info.java files

    Support for Java 9 project Jigsaw module-info.java files

    See #554.

    This is a first draft. It seems to parse and print files quite well.

    It has one big disadvantage: there is now a second grammar, and it contains a copy of the first. The differences are small, so that should be fixable with some trickery.

    CSM or symbol solver support is not there yet.

    I think the most interesting thing to look at is the unit test: https://github.com/javaparser/javaparser/pull/800/files#diff-32ad75ad8b271ad317da30653e5b9c83

    opened by matozoid 32
  • SymbolSolver is unable to .resolve()

    SymbolSolver is unable to .resolve()

    Hello,

    i am trying to find the fully qualified name of interface main.MyInterface<E> that is being implemented in class main.MyClass<E>.

    package main;
    public class MyClass<E> implements MyInterface<E> { }
    
    package main;
    
    public class MyInterface<E> { }
    
    for (ClassOrInterfaceType type : classDeclaration.getImplementedTypes()) {
    	ResolvedReferenceType rrt = type.resolve(); // exception gets thrown here
    	if (rrt != null) {
    		String interfaceName = rrt.getQualifiedName();
    		// do other stuff with it
    	}
    }
    

    Sadly, this yields me an exception:

    Symbol resolution not configured: to configure consider setting a SymbolResolver in the ParserConfiguration
    	at com.github.javaparser.ast.Node.lambda$getSymbolResolver$5(Node.java:682)
    	at java.base/java.util.Optional.map(Optional.java:254)
    	at com.github.javaparser.ast.Node.getSymbolResolver(Node.java:679)
    	at com.github.javaparser.ast.type.ClassOrInterfaceType.resolve(ClassOrInterfaceType.java:292)
    

    I am setting a SymbolSolver before I start running .resolve():

    CombinedTypeSolver typeSolver = new CombinedTypeSolver(new ReflectionTypeSolver());
    // optionally some more external libraries added (required for what I am doing)
    CombinedTypeSolver finalTypeSolver = new CombinedTypeSolver(typeSolver);
    if (path.endsWith(".jar")) {
    	finalTypeSolver.add(new JarTypeSolver(path));
    } else if (path.endsWith("src")){
    	finalTypeSolver.add(new JavaParserTypeSolver(path));
    }
    
    JavaSymbolSolver symbolSolver = new JavaSymbolSolver(finalTypeSolver);
    JavaParser.getStaticConfiguration().setSymbolResolver(symbolSolver);
    

    I also double checked without the generic types and it always yields the same exception. Same issue with extending from classes. Am I doing something wrong or why does this not work as intended?

    I just updated to the 3.7.1 (from 3.6.23) and now the exception is now this:

    java.lang.IllegalStateException: No data of this type found. Use containsData to check for this first.
    	at com.github.javaparser.ast.Node.getData(Node.java:457)
    	at com.github.javaparser.ast.Node.lambda$getSymbolResolver$5(Node.java:699)
    	at java.base/java.util.Optional.map(Optional.java:254)
    	at com.github.javaparser.ast.Node.getSymbolResolver(Node.java:698)
    	at com.github.javaparser.ast.type.ClassOrInterfaceType.resolve(ClassOrInterfaceType.java:292)
    

    Since this did work before and only started to fail recently, I double checked what I did differently. And it turns out that I previously was using a path to a source folder (JavaParserTypeSolver). Now I am trying to read a JAR file and therefore use the JarTypeSolver, but it does not seem to work with that one. Whats going on here?

    Bug report Symbol Solver 
    opened by un0btanium 30
  • Avoid returning null lists

    Avoid returning null lists

    • every list is now initialized as an empty list
    • for backward compatibility setters accept a null but convert it to an empty lists
    • a few bugs are found: the current code was checking for a list to be null but it did not consider the possibility it was empty

    We have discussed about it on Gitter, I hope I did not forget any of the advices I received if I did please forgive me and remember me and I will update the pull requests.

    opened by ftomassetti 30
  • Methods accessible by a PackageDeclaration instance

    Methods accessible by a PackageDeclaration instance

    Hello JP, smiles So I'm working on this really interesting library which requires that this method: 'setJavadoc(Javadoc javadoc)' becomes accessible by a PackageDeclaration instance. My project is currently on hold due to the absence of this feature, so I'm actually suggesting an inclusion of this feature in your library. Patiently hoping this suggestion is considered and the library updated. Thanks JP.

    Improvement Comment support 
    opened by divad1998 29
  • How can I access the contents of my code?

    How can I access the contents of my code?

    Hi, I am new to Java Parser and I'm trying to understand how to use some of its features - if what I am thinking can be achieved.

    I have this piece of code, mainly for experimenting with Java Parser:

                     int x = 4;
    		if (x>3) {
    			for (int i=0; i<4; i++)
    				//TO-DO
    		}
    		else {
    			if (x>1) {
    				//TO-DO
    			}
    			else {
    				//TO-DO
    			}
    		}
    

    What I would like to achieve is to call JP, and based on the order of the constructs to perform some operations. So far I have tried to do this for the if statements with the public void visit(IfStmt n, Void arg) method, but this method just identifies all the ifs located in my code, without preserving the order (the second if is inside the first and not below).

    Is there a way to identify all constructs in my code and preserve their order? (I am not looking to print the AST).

    Question (JP usage) 
    opened by is742 26
  • Comments within methods not getting parsed

    Comments within methods not getting parsed

    The java class that we want to parse looks like this.

    public class StepImplementation {
        @Step("A step")
        public void contextStep() {
            // Foo bar
        }
    }
    

    When we parse this class using JavaParser.parse, the comments are ignored. CompilationUnit.toString() prints the following output. Notice that the comments within the method contextStep() is not there.

    public class StepImplementation {
        @Step("A step")
        public void contextStep() {
        }
    }
    
    Bug report Comment support 
    opened by mahendrakariya 26
  • Use threads to visit directories and parse files in parallel in SourceRoot

    Use threads to visit directories and parse files in parallel in SourceRoot

    We're getting:

    [info] Parsed 26810 files [info] ELAPSED: 70 (383 files/second)

    We wrote a regex-based tool that isn't as powerful as a Java compiler front-end, but still does a lot of work, and with that we're getting:

    26707 all Java files 32581 total files [info] ELAPSED: 19 (1714 files/second)

    It's likely that much of the difference in speed is due to the 1000 threads and 500 open files allowed in the faster one.

    Improvement Easy 
    opened by jimshowalter 24
  • ImportDeclaration to have getImportAsString method to get full import

    ImportDeclaration to have getImportAsString method to get full import

    ImportDeclaration class to have a getImportAsString method which will return fully qualified name of import irrespective of implementation of ImportDeclaration.

    public abstract String getImportAsString(){ }

    E.g. For code import java.util.List; output: java.util.List For code import static java.lang.System.out; output: java.lang.System.out For code import java.util.*; output: java.util.* For code import static java.lang.System.*; output: java.lang.System.*

    Improvement 
    opened by nishant-labs 24
  • chore(deps): bump actions/checkout from 3.2.0 to 3.3.0

    chore(deps): bump actions/checkout from 3.2.0 to 3.3.0

    Bumps actions/checkout from 3.2.0 to 3.3.0.

    Release notes

    Sourced from actions/checkout's releases.

    v3.3.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v3.2.0...v3.3.0

    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)
    dependencies github_actions 
    opened by dependabot[bot] 0
  • No enum constant com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_18

    No enum constant com.github.javaparser.ParserConfiguration.LanguageLevel.JAVA_18

    Our project uses impsort-maven-plugin which uses javaparser. We are considering moving to Java 18 but notice that javaparser doesn't yet support that language level.

    Is there a plan to support Java 18 soon?

    Java 18 Support 
    opened by k-wall 1
  • chore(deps): update actions/checkout action to v3.3.0

    chore(deps): update actions/checkout action to v3.3.0

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | actions/checkout | action | minor | v3.2.0 -> v3.3.0 |


    Release Notes

    actions/checkout

    v3.3.0

    Compare Source

    What's Changed
    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v3.2.0...v3.3.0


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    dependencies 
    opened by renovate[bot] 0
  • SymbolSolver is unable to .resolve()

    SymbolSolver is unable to .resolve()

    Hi I want to find the number of immediate subclasses subordinated to a class hierarchy. Basically, I want to find the NOC metric.

    For this I have created a visitor as below;

    public class NOCVisitor extends VisitorAdapter<Void> {
    	private ResolvedTypeDeclaration resolvedType;
        private List<TypeDeclaration<?>> immediateSubclasses;
        
    	 // Override the visit method for ClassOrInterfaceDeclaration nodes
        @Override
        public void visit(ClassOrInterfaceDeclaration cid, Void arg) {
        	// Get the superclass of the class
        	
            NodeList<ClassOrInterfaceType> extendedTypes = cid.getExtendedTypes();
            if (extendedTypes.isEmpty()) {
                return;
            }
            ResolvedType extendedType = extendedTypes.get(0).resolve();//?????
            if (extendedType.isTypeVariable()) {
                return;
            }
            ClassOrInterfaceType superclassType = extendedTypes.get(0);
    
            // Find all the classes that extend the superclass
            CompilationUnit cu = (CompilationUnit) cid.getParentNode().get();
            List<ClassOrInterfaceDeclaration> subclassDeclarations = cu.findAll(ClassOrInterfaceDeclaration.class, c -> c.getExtendedTypes().stream().anyMatch(t -> t.equals(superclassType)));
    
            // Print the name of the superclass and the number of classes that extend it
            System.out.println("Superclass " + extendedType.asReferenceType().getQualifiedName() + " has " + subclassDeclarations.size() + " immediate subclasses");
    
            super.visit(cid, arg);
        }
    

    to call the visitor I have used CompilationUnit and I have parsed it. then ı have called the visitor. as below;

    File dir = new File(path);
    			JavaParser javaParser = new JavaParser();
    
    			// Iterate over all the files in the directory
    			for (File file : dir.listFiles()) {
    				collector= new ClassStatCollector();
    				// Skip files that are not Java source code files
    				if (!file.getName().endsWith(".java")) {
    					continue;
    				}
    				className=file.getName().substring(0, file.getName().indexOf("."));
    
    				cu = javaParser.parse(file).getResult().orElse(null);
    
    				
    				//find the num of immediate children -- NOC
    				
    				NOCVisitor nocVisitor = new NOCVisitor();
    				cu.accept(nocVisitor, null);
    				
    			}
    

    I am actually using a collector to keep the values but this was only to check if it works. I have done the same thing with wmc and dit metrics. they are working perfectly. However I am getting an error when ı use the solver. like below

    Exception in thread "main" java.lang.IllegalStateException: Symbol resolution not configured: to configure consider setting a SymbolResolver in the ParserConfiguration
    	at com.github.javaparser.ast.Node.lambda$getSymbolResolver$7(Node.java:790)
    	at java.base/java.util.Optional.map(Optional.java:260)
    	at com.github.javaparser.ast.Node.getSymbolResolver(Node.java:786)
    	at com.github.javaparser.ast.type.ClassOrInterfaceType.resolve(ClassOrInterfaceType.java:326)
    	at com.project.visitors.NOCVisitor.visit(NOCVisitor.java:30)
    	at com.project.visitors.NOCVisitor.visit(NOCVisitor.java:1)
    	at com.github.javaparser.ast.body.ClassOrInterfaceDeclaration.accept(ClassOrInterfaceDeclaration.java:98)
    	at com.github.javaparser.ast.visitor.VoidVisitorAdapter.lambda$visit$43(VoidVisitorAdapter.java:175)
    	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    	at com.github.javaparser.ast.NodeList.forEach(NodeList.java:288)
    	at com.github.javaparser.ast.visitor.VoidVisitorAdapter.visit(VoidVisitorAdapter.java:175)
    	at com.project.visitors.VisitorAdapter.visit(VisitorAdapter.java:25)
    	at com.github.javaparser.ast.CompilationUnit.accept(CompilationUnit.java:133)
    	at com.project.sysClasses.MainSys.analyzeProjectStats(MainSys.java:71)
    	at com.project.GUI.Main.main(Main.java:35)
    

    So I will use this resolve a lot as I understand because I have a bunch of metrics to calculate. And I have skipped it since it has an error but the same problem occurred when I try to find NOC and RFC metrics. I will find this metrics for a project so there will be more than one java class. What ı am missing here, I am literally get blind while I am searching.

    Question (JP usage) Need test case 
    opened by burcualper 8
  • Two qustion about using type & declaration. Resolve jars which wasn't imported .

    Two qustion about using type & declaration. Resolve jars which wasn't imported .

    I have two question below:

    1. Why I can judge type isNested in declaration but cannot judge it in ClassOrInterfaceType?
    2. If I try to resolve some of java file , but their dependency jar is not registered in symbolresolver . How to resolve it without using jar? In details, can jp build a phantom class to resolve when no jar were import and use jar in self customized level when jars were import . maybe it is a complex requirement.

    Thanks.

    Question (JP usage) 
    opened by Yelixing 6
Releases(v_snapshot_e2590f3)
Project on End to End CI/CD pipeline for java based application using Git,Github,Jenkins,Maven,Sonarqube,Nexus,Slack,Docker and Kuberenets with ECR as private docker registry and Zero Downtime Deployment

Project on End to End CI/CD pipeline for java based application using Git,Github,Jenkins,Maven,Sonarqube,Nexus,Slack,Docker and Kuberenets with ECR as private docker registry and Zero Downtime Deployment.

NITHIN JOHN GEORGE 10 Nov 22, 2022
Java library for handling exceptions in concise, unified, and architecturally clean way.

NoException NoException is a Java library for handling exceptions in concise, unified, and architecturally clean way. System.out.println(Exceptions.lo

Robert Važan 79 Nov 17, 2022
simple tail call optimization and stack safety for Java

com.github.kag0.tail simple tail call optimization for Java enables infinitely deep tail recursive calls without throwing a StackOverflowError no tran

Nathaniel Fischer 18 Dec 7, 2022
Dynamic Code Evolution VM for Java 7/8

NEWS: Dcevm-11 on Trava OpenJDK There is a new distribution channel for DCEVM-11 binaries on - TravaOpenjdk! DCEVM This project is a fork of original

null 1.6k Dec 28, 2022
A library that simplifies error handling for Functional Programming in Java

Faux Pas: Error handling in Functional Programming Faux pas noun, /fəʊ pɑː/: blunder; misstep, false step Faux Pas is a library that simplifies error

Zalando SE 114 Dec 5, 2022
Java unlimited redefinition of classes at runtime.

Hotswap Agent This is an overview page, please visit hotswapagent.org for more information. Overview Java unlimited runtime class and resource redefin

null 1.9k Dec 30, 2022
SneakyThrow is a Java library to ignore checked exceptions

SneakyThrow SneakyThrow is a Java library to ignore checked exceptions. You can integrate it using maven: <dependency> <groupId>com.rainerhahnekamp<

Rainer Hahnekamp 73 Nov 8, 2022
Java 1-15 Parser and Abstract Syntax Tree for Java, including preview features to Java 13

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

JavaParser 4.5k Jan 9, 2023
Immutable in-memory R-tree and R*-tree implementations in Java with reactive api

rtree In-memory immutable 2D R-tree implementation in java using RxJava Observables for reactive processing of search results. Status: released to Mav

Dave Moten 999 Dec 20, 2022
Tree View; Mind map; Think map; tree map; custom view; 自定义; 树状图;思维导图;组织机构图;层次图

GysoTreeView 【中文】【English】 ⭐ If ok, give me a star ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ Tree View; Mind map; Think map; tree map; 树状图;思维导图;组织机构图;层次图;树型图 A custom tree view for

怪兽N 303 Dec 30, 2022
Parser of the table of contents file of the 1C platform syntax helper

Парсер файла оглавления синтакс-помощника платформы 1С Что делает? Парсит вот это: Оглавление представляет собой файл без расширения, лежит в файле sh

null 9 Jan 27, 2022
An Appointment app preview.

BOOKME APP This Application is an Example of Appointment System in which you can book your appointment at Hospitals,Hotels,Saloons,Cinemas,etc. This A

null 5 Nov 29, 2022
This repository holds the famous Data Structures (mostly abstract ones) and Algorithms for sorting, traversing, and modifying them.

Data-Structures-and-Algorithms About Repo The repo contains the algorithms for manipulating the abstract data structures like Linked List, Stacks, Que

Zaid Ahmed 14 Dec 26, 2021
esProc SPL is a scripting language for data processing, with well-designed rich library functions and powerful syntax, which can be executed in a Java program through JDBC interface and computing independently.

esProc esProc is the unique name for esProc SPL package. esProc SPL is an open-source programming language for data processing, which can perform comp

null 990 Dec 27, 2022
Kodlama.io'da verilen ödev gereği Engin Demiroğ'un düzenlediği C# ile birlikte gerçek hayatta interface ve abstract konulu yayının Java uyarlaması yapılmıştır.

GercekHayattaInterfaceVeAbstract Kodlama.io'da verilen ödev gereği Engin Demiroğ'un düzenlediği C# ile birlikte gerçek hayatta interface ve abstract k

Baran Emre Türkmen 7 May 11, 2021
Abstract machine for formal semantics of SIMP (Simple Imperative Language)

SIMP-abstract-machine In 2020/21 I was a Teaching Assistant for the second year module 5CCS2PLD Programming Language Paradigms at King's College Londo

Sten Arthur Laane 25 Oct 10, 2022
Abstract the use of amazon lex / google dialog flow, while also support complex conditional flows

amazon-lex-gcp-diaglogflow-abstraction on simply put: ALGDA :) In this project I try to abstract the use of amazon lex first, but then also google's d

Shimon Magal 10 Apr 19, 2021
Dynamically filters JPA entities with a simple query syntax. Provides JPA/Hibernate predicates and Spring Data specifications.

Spring Filter You need a way to dynamically filter entities without any effort? Just add me to your pom.xml. Your API will gain a full featured search

Turkraft 142 Dec 13, 2022
Allows you to use the MongoDB query syntax to query your relational database.

Spring Data JPA MongoDB Expressions How it works: Customize JPA Repository base class: @SpringBootApplication @EnableJpaRepositories(repositoryBaseCla

Muhammad Hewedy 86 Dec 27, 2022