Eclipse / Packages in "Project Explorer" display is dropping leading components - java

I recently updated my Eclipse to 2021-06 and have a sudden change in appearance for the packages when using "Project Explorer" - the packages still display correctly when using "Package Explorer".
What setting changed during the update that I can change to get back the classical display as used in "Package Explorer"?
Correct "Package Explorer" display using package display "flat":
Very Confusing and Unwanted "Project Explorer" display using package display "flat":
Java package folders:
tree .
.
└── com
└── newsrx
└── jam
├── api
│   └── GreetingController.java
├── Application.java
├── config
│   └── SecurityConfiguration.java
├── NpmPackages.java
├── user
│   ├── ep
│   │   └── UserInfoEndpoint.java
│   ├── UserInfo.java
│   ├── User.java
│   └── UserSession.java
└── views
├── dashboard
│   ├── ChartSeries.java
│   ├── DashboardEndpoint.java
│   └── HealthGridItem.java
└── LoginScreen.java
Misc Info:
Eclipse.org Eclipse Java Development Tools 3.18.800.v20210611-1600 org.eclipse.jdt
Eclipse.org Eclipse Platform 4.20.0.v20210611-1600 org.eclipse.platform
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 21.04
Release: 21.04
Codename: hirsute
java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
Java→Appearance

Related

Annotation proccessor configuration from a Gradle multi module build in IntelliJ 2019.3 seems not to work correctly

I have a Gradle multi module project that uses the Mapstruct annotation processor for data type mapping across Java modules. The Gradle build works fine but when I import the project into IntellJ IDEA 2019.3 I get an unexpected annotation processor configuration.
The project structure looks like this
.
├── build.gradle
├── module1
│   └── src
│   └── main
│   └── java
│   └── io
│   └── wangler
│   └── mapstruct
│   ├── ApplicationModule1.java
│   ├── Person.java
│   ├── PersonDTO.java
│   └── PersonMapper.java
├── module2
│   └── src
│   └── main
│   ├── generated
│   │   └── ch
│   │   └── silviowangler
│   │   └── mapstruct
│   │   └── CarMapperImpl.java
│   └── java
│   └── ch
│   └── silviowangler
│   └── mapstruct
│   ├── ApplicationModule2.java
│   ├── Car.java
│   ├── CarDTO.java
│   └── CarMapper.java
└── settings.gradle
and the build.gradle that registers the annotation processor for module1 and module2.
subprojects { p ->
apply plugin: 'java-library'
apply plugin: 'groovy'
repositories {
jcenter()
}
dependencies {
annotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
testImplementation 'org.codehaus.groovy:groovy-all:2.5.8'
testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5'
testImplementation 'junit:junit:4.12'
}
}
When I compile the project using ./gradlew compileJava all works out fine and I get no compilation errors.
But when I run Rebuild Project withing IntelliJ I get a compilation error in module1 since IntelliJ does not have an annotation processor registered for module1.
Error:(6, 35) java: cannot find symbol
symbol: class PersonMapperImpl
location: class io.wangler.mapstruct.ApplicationModule1
Am I doing something wrong here or is this a known IntelliJ issue? The source code for this example can be found at https://github.com/saw303/idea-annotation-processors
I faced the same issue in IDEA 2019.3. Looks like a bug.
It occurs only if two modules has the same set of annotation processors.
To solve the problem you need to add any library using annotationProcessor directive to one of modules. It does not have to be a real annotation processor. This one is working for me:
annotationProcessor "commons-io:commons-io:${commonsIoVersion}"
I have created a defect in JerBrains bugtracker: IDEA-230337

Unable to resolve java build / Spring

First Thing to say, I am a relatively inexperienced programmer.
My task is to import a given gradle project into Spring Boot Tool Suite (sts). I have already download springboot cli, java, gradle. & In the past, I was able to run spring perfectly on another project, unfortunately I had to get my hard drive replaced, so I lost a considerable amount of downloads.
Nonetheless, my issue is two-parted. Firstly, my tool suite (ide? It's basically eclipse) does not recognize my project as a a java project, I have tried many options & the only was to fix that portion is to hardcode org.eclipse.core.javabuilder within the buildCommand tag in my .project file, which I don't remember doing for my last project.
Here is the directory tree of the backend folder(don't concern with the frontend)
.
├── build.gradle
├── gradle
│   └── wrapper
│   ├── gradle-wrapper.jar
│   └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
├── main
│   ├── java
│   │   └── ca
│   │   └── mcgill
│   │   └── ecse321
│   │   └── eventregistration
│   │   ├── EventRegistrationApplication.java
│   │   ├── controller
│   │   │   ├── ApiError.java
│   │   │   ├── EventRegistrationRestController.java
│   │   │   └── RestExceptionHandler.java
│   │   ├── dao
│   │   │   ├── EventRegistrationRepository.java
│   │   │   ├── EventRepository.java
│   │   │   ├── PersonRepository.java
│   │   │   └── RegistrationRepository.java
│   │   ├── dto
│   │   │   ├── EventDto.java
│   │   │   ├── PersonDto.java
│   │   │   └── RegistrationDto.java
│   │   ├── model
│   │   │   ├── Event.java
│   │   │   ├── Person.java
│   │   │   ├── Registration.java
│   │   │   └── RegistrationManager.java
│   │   └── service
│   │   └── EventRegistrationService.java
│   └── resources
│   └── application.properties
└── test
└── java
└── ca
└── mcgill
└── ecse321
└── eventregistration
└── service
├── event
│   └── TestCinema.java
├── payment
│   ├── TestPaymentWithCreditCard.java
│   ├── TestPaymentWithCreditCardData.java
│   └── TestUtils.java
└── role
├── PromoterRoleTestData.java
└── TestPromoterRole.java
Additionally, Here it my build.gradle file
buildscript {
ext {
springBootVersion = '2.1.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'org.postgresql:postgresql'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
This fixes my java problem, but I still cannot get it running as a spring boot application.
Please help as I am not sure where to continue!!! I need to be able to run this project as a spring boot application for backend services, as I will then be tasked with connecting it to frontend services with vue.js. (Don't worry i got that part)!
Here is my EventRegistration.java file as well
package ca.mcgill.ecse321.eventregistration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
#RestController
#SpringBootApplication
public class EventRegistrationApplication {
public static void main(String[] args) {
SpringApplication.run(EventRegistrationApplication.class, args);
}
#RequestMapping("/")
public String greeting() {
return "ECSE321 Event Registration Application - Backend base URL.\n"
+ "Use the API methods to interact with the backend!";
}
}
Though I stopped using eclipse but following used to solve situations like this
1.
- Eclipse ->preferences-->java-->installed JRE --> select a standard vm
(can find here jdk1.8.0_51.jdk/Contents/Home)
2.
- add the JRE System Library to your project build path
- right click project > select build path > libraries >
- if JRE is listed then good otherwise > add Library
- select JRE library and finish

Javalite framework - problem with locating existing FreeMarker templates

I am developing a simple web application which provides RestFul API for managing several resources.
I am using java standard edition - openjdk version "1.8.0_191 and the following javalite dependencies:
javalite-common-2.3-SNAPSHOT.jar
activejdbc-2.3-SNAPSHOT.jar
activeweb-2.3-SNAPSHOT.jar
activeweb-testing-2.3-SNAPSHOT.jar
freemarker-2.3.28.jar
I use embedded jetty v9.4.1 for web server and the whole project is packed as jar with dependencies and is run using the following command:
java -Dconfig=/etc/project/config.properties -jar jarname.jar
The web application is designed to serve only JSON and all FreeMarker templates construct json messages. Here is my FreeMarker config class:
public class FreeMarkerConfig extends AbstractFreeMarkerConfig {
#Override
public void init() {
// this is to override a strange FreeMarker default processing of numbers
Configuration config = this.getConfiguration();
config.setNumberFormat("0.##");
config.setClassicCompatible(true);
config.setClassForTemplateLoading(this.getClass(), "webapp/WEB-INF/views");
}
}
After the packaging the structure inside the jar is as follows (this is a simplified version with only one resource):
├── META-INF
│   ├── MANIFEST.MF
│   └── maven
│   └── project.control
│   └── panel
│   ├── pom.properties
│   └── pom.xml
├── activejdbc_models.properties
├── app
│   ├── config
│   │   ├── AppBootstrap.class
│   │   ├── AppControllerConfig.class
│   │   ├── DbConfig.class
│   │   ├── FreeMarkerConfig.class
│   │   └── RouteConfig.class
│   ├── controllers
│   │   ├── APIController.class
│   │   ├── CatchAllFilter.class
│   │   ├── OfficesController.class
│   └── models
│   ├── Office.class
├── config.properties
├── project
│   └── control
│   └── panel
│   ├── Launcher.class
│   ├── dao
│   │   ├── query
│   │   │   ├── Query.class
│   │   │   ├── QueryBuilder.class
│   │   │   ├── QueryStringBuilder.class
│   │   │   ├── StatsParamsHandler.class
│   │   └── validators
│   │   ├── OfficeValidator.class
│   ├── exceptions
│   │   └── ResourceNotFoundException.class
│   └── util
│   ├── Config.class
│   ├── JsonHelper.class
└── webapp
└── WEB-INF
├── views
│   ├── offices
│   │   ├── _comma.ftl
│   │   ├── _office.ftl
│   │   ├── _office_agency.ftl
│   │   ├── _office_agent.ftl
│   │   └── index.ftl
│   ├── layouts
│   │   └── default_layout.ftl
│   ├── shared
│   │   ├── _paging.ftl
│   │   └── message.ftl
│   ├── system
│   │   ├── 404.ftl
│   │   └── error.ftl
└── web.xml
Most of the time everything seems to operate normally and without any problems. But at some point something happens and FreeMarker is unable to locate the templates which were previously served multiple times.
I am not able to reproduce the behaviour on localhost so I am not able to debug it.
It happened several times while running on a server. The only observation I had is that it happens after several idle hours - i.e there were no requests for several hours, the next request fails because FreeMarker can't locate the needed template. Here is the exact exception which is thrown, when /offices is requested:
2019-06-24 15:22:50 - INFO LazyList:164 - {"sql":"SELECT * FROM offices ORDER BY id LIMIT 20 OFFSET 0 ","params":[],"duration_millis":2,"cache":"miss"}
2019-06-24 15:22:50 - INFO DB:164 - {"sql":"SELECT COUNT(*) FROM offices","params":[],"duration_millis":0}
2019-06-24 15:22:50 - INFO FreeMarkerTemplateManager:81 - Rendering template: '/offices/index.ftl' without layout.
2019-06-24 15:22:50 - INFO FreeMarkerTemplateManager:81 - Rendering template: '/shared/message.ftl' without layout.
2019-06-24 15:22:50 - INFO RequestDispatcher:360 - {"controller":"app.controllers.OfficesController","duration_millis":15,"remote_ip":"127.0.0.1","method":"GET","action":"index","error":"Failed to render template: '/shared/message.ftl' without layout. Template not found for name \\\"/shared/message.ftl\\\".\\nThe name was interpreted by this TemplateLoader: WebappTemplateLoader(subdirPath=\\\"/WEB-INF/views/\\\", servletContext={contextPath=\\\"\\\", displayName=\\\"activeweb\\\"}).","url":"http://127.0.0.1:5050/offices","status":404}
2019-06-24 15:22:50 - INFO FreeMarkerTemplateManager:81 - Rendering template: '/system/404.ftl' with layout: '/layouts/default_layout.ftl'.
2019-06-24 15:22:50 - ERROR RequestDispatcher:290 - ActiveWeb internal error:
org.javalite.activeweb.ViewMissingException: Failed to render template: '/system/404.ftl' with layout: '/layouts/default_layout.ftl'. Template not found for name "/system/404.ftl".
The name was interpreted by this TemplateLoader: WebappTemplateLoader(subdirPath="/WEB-INF/views/", servletContext={contextPath="", displayName="activeweb"}).
at org.javalite.activeweb.freemarker.FreeMarkerTemplateManager.merge(FreeMarkerTemplateManager.java:109)
at org.javalite.activeweb.RenderTemplateResponse.doProcess(RenderTemplateResponse.java:88)
at org.javalite.activeweb.ControllerResponse.process(ControllerResponse.java:67)
at org.javalite.activeweb.RequestDispatcher.renderSystemError(RequestDispatcher.java:283)
at org.javalite.activeweb.RequestDispatcher.doFilter(RequestDispatcher.java:219)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1613)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:541)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1584)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1228)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:481)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1553)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1130)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:564)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:112)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
at java.lang.Thread.run(Thread.java:748)
Additional details can be provided in case of need.
What may cause such problems - while everything seems operational, suddenly FreeMaker can't locate templates which were previously served without any problems.
Any suggestions that may help for debugging the issue will be appreciated.
Thanks!
After more detailed investigation it appeared that jetty extracts the FreeMarker templates from the jar and places them in /tmp folder. The folder has the following pattern
/tmp/jetty-<host>-<port>-<resourceBase>-<context>-<virtualhost>-<randomdigits>.dir
Example:
jetty-0.0.0.0-5050-webapp-_-any-35239075401795634.dir
Unix based operation systems have policy for cleaning /tmp folder and after the folder is deleted - obviously the templates can't be found.
The solutions is to configure jetty's WebAppContext to use another directory for this kind of data. This can be done with setTempDirectory method:
String webViewsPath = Launcher.class.getResource("/webapp").toString();
WebAppContext webapp = new WebAppContext(webViewsPath, "/");
webapp.setTempDirectory(new File("/data/templates"));
server.setHandler(webapp);
More information for jetty's temporary directories can be found here:
https://www.eclipse.org/jetty/documentation/9.4.x/ref-temporary-directories.html

Package does not exist IntelliJ

I'm using IntelliJ to develop a java application but I'm not able to import any of the packages I created. I marked my src folder as Sources Root and the tree suggests I'm able to import a package by just
import service.RMI;
on my App.java file.
but when I try to compile
javac App.java
I get an error saying
App.java:4: error: package service does not exist
import service.RMI;
^
Does anyone knows why this happens? Does it have to do with my project skeleton?
For a better understanding, I leave my project tree:
.
├── algorithms
│   └── SHA256.java
├── app
│   ├── App.class
│   └── App.java
├── file
│   ├── ChunkFile.java
│   └── Chunk.java
├── filesystem
│   └── filesystem.java
├── META-INF
│   └── MANIFEST.MF
├── peer
│   ├── listeners
│   │   ├── MClistener.java
│   │   └── MDBlistener.java
│   └── Peer.java
├── protocols
│   ├── Backup.java
│   ├── Delete.java
│   └── Restore.java
└── service
└── RMI.java
I found the solution.
I was compiling all wrong. I was trying to run
javac App.java
on my app directory but I figured out that I need to run
javac app/App.java
on my root directory - src, and then, to run the app I need
java app.App
Thanks for the kind replies.
Regards

How should my MANIFEST.MF look?

I have the following directly structure:
mp1
├── lib
│   └── kryonet-2.21-all.jar
├── mp1.iml
├── out
│   ├── artifacts
│   │   └── UX
│   │   ├── META-INF
│   │   │   └── MANIFEST.MF
│   │   └── UX.jar
├── src
│   ├── [.class files]
│   └── cs425
│   └── mp1
│   ├── agent
│   │   ├── [handlers].java
│   ├── common
│   │   ├── [commons].java
│   ├── main
│   │   └── UX.java
│   └── network
│   ├── [networks].java
I'm completely new to mainfest files, and am just trying to get a .jar to run on a remote box. My manifest looks like this right now:
Manifest-Version: 1.0
Main-Class: cs425.mp1.main.UX
But I just keep getting,
~/mp1$ java -jar UX.jar
Error: Invalid or corrupt jarfile UX.jar
Any help? I'm not sure what options to add for my external library and how to define my classpath.
It appears as though the only thing I was missing was the classpath to my external .jar file. My manifest now looks like:
Manifest-Version: 1.0
Main-Class: cs425.mp1.main.UX
Class-Path: kryonet-2.21-all.jar
After making sure all of my required files are part of the artifact package (my manifest file, external jar, etc), the issue seems to have gone away.

Categories