Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
devel:documentation:quickstart:dev:ide:eclipse [2022/08/01 09:41] janatam |
devel:documentation:quickstart:dev:ide:eclipse [2024/01/09 08:27] (current) koulaj [Install Tomcat] |
export JAVA_HOME=/path/to/installed/jdk/ | export JAVA_HOME=/path/to/installed/jdk/ |
./eclipse | ./eclipse |
| |
| |
</code> | </code> |
**Note:** If you don't set metamodel generation, you will see Java problems like ''ExampleProduct_ cannot be resolved to a variable''. | **Note:** If you don't set metamodel generation, you will see Java problems like ''ExampleProduct_ cannot be resolved to a variable''. |
| |
* Go to Project → Properties → Java Compiler → Annotation Processing → check "Enable project specific settings" and fill "Generated source directory" = "target/metamodel_ckgedit_QUOT__ckgedit>. * Go to Project → Properties → Java Compiler → Annotation Processing → Factory path → check "Enable project specific settings" and add external jar **hibernate-jpamodelgen.jar** (version 5.x.x). Artefact could be found in local maven repository or downloaded from any public maven repository. If this solution didn't help and you still see the ''ExampleProduct_ cannot be resolved to a variable'' error, you have to build the project in command line. Go to the relevant paths (e. g., /git/CzechIdMng/Realization/backend/rpt) and run ''mvn clean install''. Do this for every directory that shows this error. ===== = Build the Project ====== After that you can build the projects from Eclipse by Project → Build Project or you can check "Build Automatically". If you see some dependency errors try this approach: Right-click the project "idm-aggregator" and choose "Run as" → "Maven install". The first build of the project will download necessary libraries to your local Maven repository (e.g. "forest" from Nexus repository). If dependency errors still remain, for all projects: Right click on the project → Maven → Update Project… → click Select All → Click OK ====== Install Tomcat ====== Download Tomcat 8.0.* (tested version 8.0.36) from Apache website. Unzip it somewhere in your home directory. Next we will install Tomcat as a Server to the Eclipse: Show the tab "Servers" if it isn't visible yet: Window → Show View → Servers Create new server: In the tab "Servers", right-click and choose New → Server → Apache → Tomcat v8.0 Server - Next → For „Tomcat installation directory“ select the path to the installed Tomcat directory. As "JRE" choose installed JDK. Then Next → Next → Finish. Add idm-app as an application to Tomcat: Right-click on the Tomcat server, choose "Add and Remove" and select "idm-app" Optionally set some other options for the server: Double-click on the Tomcat server, then * in the section "Timeouts" increase the timeout for start to 240 s. * in the section "Server Options", uncheck "Modules auto reload by default". ====== Deploy changes without reloading ====== Small changes in code may be applied to the server without restarting the server or reloading modules (hot code replacement). This can be configured as follows: - Double-click on the Tomcat server, in the section "Publishing" choose the option "Automatically publish when resources change" - Switch to the "Modules" tab of the Tomcat server and choose the module "idm-app". Click the button "Edit…" and uncheck "Auto reloading enabled". After submitting you should see the value "Disabled" in the column "Auto Reload". - Save changes in the Tomcat server configuration - Start the Tomcat server in "DEBUG" mode. ====== Run unit & integration tests ====== When you want to run unit tests, you must switch to Maven profile **test**. Otherwise some tests (especially those which use database connection) may fail. Set the "test" profile: Right click "idm-app" (or the module which you want to test) → Maven → Select Maven Profiles → check "test" If you want to run only tests in some class: 1) open this class, 2) right click on the class name, 3) choose Run As → JUnit Test. ====== Common development & tips ====== ===== Tomcat server fails to start ===== If Tomcat server fails to start, try following: * Check all common development tips * Check build errors - check that the tab Markers or Problems doesn't show any Java or Maven build error. (You can ignore XML validation problems.) If it does, try updating Maven project. * Try Clean/Publish actions on the Tomcat server. * Try restarting Eclipse. The exception: '' org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationFilter': Injection of autowired dependencies failed …… very long stacktrace ……. Error creating bean with name 'flywayCore' defined in class path resource [eu/bcvsolutions/idm/core/config/flyway/CoreFlywayConfig.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Comparison method violates its general contract! '' is probably caused by a bug in Flyway. In such case, go to Windows → Preferences → Installed JREs→ edit JRE and add to default VM arguments ''-Djava.util.Arrays.useLegacyMergeSort=true'' Another possible issue may be an exception like this one: '' java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/idm-app]] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/idm-app]] at org.apache.catalina.util.L Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [eu.bcvsolutions.idm.IdmApplication]; nested exception is java.io.FileNotFoundException: class path resource [eu/bcvsolutions/idm/test/api/AbstractIntegrationTest.class] cannot be opened because it does not exist at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:182) '' If you see this, make sure that * you have the project idm-core-test-api open * in Properties of the idm-core-impl (or any problematic project), check Java Build Path and make sure that each test folder has the Output folder set to test-classes. See below: If you have a problem in not being able to Add and Remove, try to open idm-app, look at Properties, Project Facets and check you have the correct version of Java: {{ .:screenshot_from_2019-06-20_09-55-36.png?direct&600 }}===== | * Go to Project → Properties → Java Compiler → Annotation Processing → check "Enable project specific settings" and fill "Generated source directory" = "target/metamodel". |
| * Go to Project → Properties → Java Compiler → Annotation Processing → Factory path → check "Enable project specific settings" and add external jar **hibernate-jpamodelgen.jar** (version 5.x.x). Artefact could be found in local maven repository or downloaded from any public maven repository. |
| |
{{ .:screenshot_from_2019-06-17_16-26-24.png?direct&600 }} Update project after pulling new version ===== When you pull new version of the project from Git and there were some changes including Maven dependencies (e.g. newer version of some artifact), you should update your project: * select all projects * right-click and choose Maven → Update Project The IDE will update dependencies and rebuild the projects if necessary. ===== Implementing a ConnId connector ===== We came across problematic behavior of Eclipse when implementing a ConnId connector. If you develop the connector that is a dependency of CzechIdM and the same connector (in the same version) is opened in Eclipse, then Tomcat with CzechIdM may fail to start with the following exception: '' Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationFilter': Injection of autowired dependencies failed …. nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [eu.bcvsolutions.idm.ic.service.impl.DefaultIcConfigurationFacade]: Constructor threw exception; nested exception is java.lang.NullPointerException '' If you encounter this exception and you want to use Debug server mode for implementing the connector (deploying without restarts), try the following steps: * Open **pom.xml** of the connector and add inside the tags ''<build><plugins>'': ''__''GESHI_OPEN__plugin>__GESHI_OPEN__groupId>org.apache.maven.plugins__GESHI_OPEN__/groupId>__GESHI_OPEN__artifactId>maven-jar-plugin__GESHI_OPEN__/artifactId>__GESHI_OPEN__configuration>__GESHI_OPEN__archive>__GESHI_OPEN__addMavenDescriptor>false__GESHI_OPEN__/addMavenDescriptor>__GESHI_OPEN__manifestEntries>__GESHI_OPEN__ConnectorBundle-FrameworkVersion>${connid.version}__GESHI_OPEN__/ConnectorBundle-FrameworkVersion>__GESHI_OPEN__ConnectorBundle-Name>${project.artifactId}__GESHI_OPEN__/ConnectorBundle-Name>__GESHI_OPEN__ConnectorBundle-Version>${project.version}__GESHI_OPEN__/ConnectorBundle-Version>__GESHI_OPEN__/manifestEntries>__GESHI_OPEN__/archive>__GESHI_OPEN__/configuration>__GESHI_OPEN__/plugin> __''__ * Right-click on the project with the connector and run Maven → Update Project * Right-click on the Tomcat server and run Clean or Publish * Go to the deployments folder of the Tomcat server (this depends on your installation, e.g.: ''/home/user/bin/apache-tomcat-8.0.36/wtpwebapps/idm-app/WEB-INF/lib/'') and remove the folder ''META-INF/maven/'' from the JAR containing your connector: '' cd /home/user/bin/apache-tomcat-8.0.36/wtpwebapps/idm-app/WEB-INF/lib/ zip -d csv-connector-1.0.0.jar ''__''GESHI_QUOT__META-INF/maven/*__GESHI>_'' | If this solution didn't help and you still see the ''ExampleProduct_ cannot be resolved to a variable'' error, you have to build the project in command line. Go to the relevant paths (e. g., /git/CzechIdMng/Realization/backend/rpt) and run ''mvn clean install''. Do this for every directory that shows this error. |
| |
''deleting: META-INF/maven/ deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/ deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/csv-connector/ deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/csv-connector/pom.properties deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/csv-connector/pom.xml '' | ====== Build the Project ====== |
| |
| After that you can build the projects from Eclipse by Project → Build Project or you can check "Build Automatically". If you see some dependency errors try this approach: Right-click the project "idm-aggregator" and choose "Run as" → "Maven install". The first build of the project will download necessary libraries to your local Maven repository (e.g. "forest" from Nexus repository). If dependency errors still remain, for all projects: Right click on the project → Maven → Update Project… → click Select All → Click OK |
| |
| ====== Install Tomcat ====== |
| |
| Download Tomcat 9.0.* (tested version 9.0.80) from Apache website. Unzip it somewhere in your home directory. |
| |
| Next we will install Tomcat as a Server to the Eclipse: Show the tab "Servers" if it isn't visible yet: Window → Show View → Servers |
| |
| Create new server: In the tab "Servers", right-click and choose New → Server → Apache → Tomcat v8.0 Server - Next → For „Tomcat installation directory“ select the path to the installed Tomcat directory. As "JRE" choose installed JDK. Then Next → Next → Finish. |
| |
| Add idm-app as an application to Tomcat: Right-click on the Tomcat server, choose "Add and Remove" and select "idm-app" |
| |
| Optionally set some other options for the server: Double-click on the Tomcat server, then |
| |
| * in the section "Timeouts" increase the timeout for start to 240 s. |
| * in the section "Server Options", uncheck "Modules auto reload by default". |
| |
| |
| ====== Deploy changes without reloading ====== |
| |
| Small changes in code may be applied to the server without restarting the server or reloading modules (hot code replacement). This can be configured as follows: |
| |
| - Double-click on the Tomcat server, in the section "Publishing" choose the option "Automatically publish when resources change" |
| - Switch to the "Modules" tab of the Tomcat server and choose the module "idm-app". Click the button "Edit…" and uncheck "Auto reloading enabled". After submitting you should see the value "Disabled" in the column "Auto Reload". |
| - Save changes in the Tomcat server configuration |
| - Start the Tomcat server in "DEBUG" mode. |
| |
| ====== Run unit & integration tests ====== |
| |
| When you want to run unit tests, you must switch to Maven profile **test**. Otherwise some tests (especially those which use database connection) may fail. Set the "test" profile: Right click "idm-app" (or the module which you want to test) → Maven → Select Maven Profiles → check "test" |
| |
| If you want to run only tests in some class: |
| |
| <code> |
| 1) open this class, |
| 2) right click on the class name, |
| 3) choose Run As → JUnit Test. |
| |
| </code> |
| |
| ====== Common development & tips ====== |
| |
| ===== Tomcat server fails to start ===== |
| |
| If Tomcat server fails to start, try following: |
| |
| * Check all common development tips |
| * Check build errors - check that the tab Markers or Problems doesn't show any Java or Maven build error. (You can ignore XML validation problems.) If it does, try updating Maven project. |
| * Try Clean/Publish actions on the Tomcat server. |
| * Try restarting Eclipse. |
| |
| The exception: '' org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationFilter': Injection of autowired dependencies failed …… very long stacktrace ……. Error creating bean with name 'flywayCore' defined in class path resource [eu/bcvsolutions/idm/core/config/flyway/CoreFlywayConfig.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Comparison method violates its general contract! '' is probably caused by a bug in Flyway. |
| |
| In such case, go to Windows → Preferences → Installed JREs→ edit JRE and add to default VM arguments ''-Djava.util.Arrays.useLegacyMergeSort=true'' |
| |
| Another possible issue may be an exception like this one: '' java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/idm-app]] Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/idm-app]] at org.apache.catalina.util.L Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [eu.bcvsolutions.idm.IdmApplication]; nested exception is java.io.FileNotFoundException: class path resource [eu/bcvsolutions/idm/test/api/AbstractIntegrationTest.class] cannot be opened because it does not exist at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:182) '' |
| |
| If you see this, make sure that |
| |
| * you have the project idm-core-test-api open |
| * in Properties of the idm-core-impl (or any problematic project), check Java Build Path and make sure that each test folder has the Output folder set to test-classes. |
| |
| {{ .:screenshot_from_2019-06-17_16-26-24.png?direct&600 }} |
| |
| See below: If you have a problem in not being able to Add and Remove, try to open idm-app, look at Properties, Project Facets and check you have the correct version of **Java ** (should be 11) abd **Dynamic Web Module ** (3.1): {{ .:screenshot_from_2019-06-20_09-55-36.png?direct&600 }} |
| |
| ===== Maven build passes, but Eclipse shows errors ===== |
| |
| It can happen that Maven builds the project fine, but eclipse Project -> Clean will throw an error, such as: |
| |
| <code>Description Resource Path Location Type |
| Failed to execute mojo org.apache.maven.plugins:maven-dependency-plugin:3.1.1:copy {execution: copy} (org.apache.maven.plugins:maven-dependency-plugin:3.1.1:copy:copy:compile) |
| |
| org.eclipse.core.runtime.CoreException: Failed to execute mojo org.apache.maven.plugins:maven-dependency-plugin:3.1.1:copy {execution: copy} |
| at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeMojo(MavenExecutionContext.java:340) |
| at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.lambda$0(MavenExecutionContext.java:291) |
| at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:394) |
| at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:275) |
| at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:290) |
| at org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant.build(MojoExecutionBuildParticipant.java:57) |
| at org.eclipse.m2e.core.internal.builder.MavenBuilderImpl.lambda$2(MavenBuilderImpl.java:153) |
| |
| </code> |
| |
| In that case, update the Maven project (right click project -> Maven -> Update Project. |
| |
| ===== Update project after pulling new version ===== |
| |
| When you pull new version of the project from Git and there were some changes including Maven dependencies (e.g. newer version of some artifact), you should update your project: |
| |
| * select all projects |
| * right-click and choose Maven → Update Project The IDE will update dependencies and rebuild the projects if necessary. |
| |
| ===== Implementing a ConnId connector ===== |
| |
| We came across problematic behavior of Eclipse when implementing a ConnId connector. If you develop the connector that is a dependency of CzechIdM and the same connector (in the same version) is opened in Eclipse, then Tomcat with CzechIdM may fail to start with the following exception: '' Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationFilter': Injection of autowired dependencies failed …. nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [eu.bcvsolutions.idm.ic.service.impl.DefaultIcConfigurationFacade]: Constructor threw exception; nested exception is java.lang.NullPointerException '' |
| |
| If you encounter this exception and you want to use Debug server mode for implementing the connector (deploying without restarts), try the following steps: |
| |
| * Open **pom.xml** of the connector and add inside the tags ''<build><plugins>'': |
| |
| <code xml> |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-jar-plugin</artifactId> |
| <configuration> |
| <archive> |
| <addMavenDescriptor>false</addMavenDescriptor> |
| <manifestEntries> |
| <ConnectorBundle-FrameworkVersion>${connid.version}</ConnectorBundle-FrameworkVersion> |
| <ConnectorBundle-Name>${project.artifactId}</ConnectorBundle-Name> |
| <ConnectorBundle-Version>${project.version}</ConnectorBundle-Version> |
| </manifestEntries> |
| </archive> |
| </configuration> |
| </plugin> |
| |
| </code> |
| |
| * Right-click on the project with the connector and run Maven → Update Project |
| * Right-click on the Tomcat server and run Clean or Publish |
| * Go to the deployments folder of the Tomcat server (this depends on your installation, e.g.: ''/home/user/bin/apache-tomcat-8.0.36/wtpwebapps/idm-app/WEB-INF/lib/'') and remove the folder ''META-INF/maven/'' from the JAR containing your connector: |
| |
| <code bash> |
| cd /home/user/bin/apache-tomcat-8.0.36/wtpwebapps/idm-app/WEB-INF/lib/ |
| zip -d csv-connector-1.0.0.jar "META-INF/maven/*" |
| |
| deleting: META-INF/maven/ |
| deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/ |
| deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/csv-connector/ |
| deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/csv-connector/pom.properties |
| deleting: META-INF/maven/eu.bcvsolutions.idm.connectors.csv/csv-connector/pom.xml |
| |
| </code> |
| |
* Check that the file ''META-INF/MANIFEST.MF'' is first or second in the JAR file: | * Check that the file ''META-INF/MANIFEST.MF'' is first or second in the JAR file: |