Reputation: 858
I have a Maven project with several submodules inside of it. They are packaged up so that I can reuse the code across several microservices. I can generate my Java classes in the parent project as I would like them to be, however, when I attempt to generate a class in a subdirectory my a package declaration that looks like:
package ${target.javaPackageFromFolder(${SRC})};
In a template will resolve to:
package error.folder.not.started.with.the.given.src.folder.activities;
In the .java
class. This is understandable since my $SRC
is at src/main/java
and not service-core/src/main/java
.
All of my modules are organized the same way, with $SRC
at src/main/java
, if I could just inform Telosys about the existence of these modules, I would be able to generate the code in the right place without needing to move it after generation.
I would just init
Telosys in the service-core
module, but I would also like to support generating DTOs in dto-public
and controllers/tests in my api-public
. Is there any way to support this in Telosys?
Things I've tried:
.vm
file that calls $generator.generate
with a different directory. This configuration produces the above result.templates.cfg
to include service-core/${SRC}/${ROOT_PKG}/model/
. This configuration also produces the above result.Upvotes: 2
Views: 248
Reputation: 2460
To generate a multi-modules Maven project I recommend the following approach :
Example:
# Root package (will be used as "root folder" in targets)
ROOT_PKG = org.demo.orders
# Maven project / parent :
ProjectVariable.MODULE_PARENT = orders-parent
# Maven project / modules :
ProjectVariable.MODULE_MICROSERVICE = orders-microservice
ProjectVariable.MODULE_DOMAIN = orders-domain
ProjectVariable.MODULE_INFRA_MYBATIS = orders-infra-mybatis
ProjectVariable.MODULE_INFRA_ELASTIC = orders-infra-elastic
ProjectVariable.MODULE_INFRA_RABBITMQ = orders-infra-rabbitmq
You can keep the usual values for the standard variables:
SRC = src/main/java
RES = src/main/resources
WEB = src/main/webapp
TEST_SRC = src/test/java
TEST_RES = src/test/resources
DOC = doc
TMP = tmp
You can combine $SRC, $MODULE_XXX and $ROOT_PKG to build the destination directory
Example (project modules initialization):
# "microservice" module
; pom.xml ; ${MODULE_MICROSERVICE} ; microservice/microservice-pom_xml.vm; 1
; README.md ; ${MODULE_MICROSERVICE} ; microservice/README_md.vm ; 1
; SpringBootApp.java ; ${MODULE_MICROSERVICE}/${SRC}/${ROOT_PKG} ; microservice/SpringBootApp_java.vm ; 1
; application.properties ; ${MODULE_MICROSERVICE}/${RES} ; microservice/application_properties.vm ; 1
; application-dev.properties ; ${MODULE_MICROSERVICE}/${RES} ; microservice/application-dev_properties.vm; 1
# Other modules initialization
; pom.xml ; ${MODULE_DOMAIN} ; modules/domain-pom_xml.vm ; 1
; pom.xml ; ${MODULE_INFRA_MYBATIS} ; modules/infra-mybatis-pom_xml.vm ; 1
; pom.xml ; ${MODULE_INFRA_ELASTIC} ; modules/infra-elastic-pom_xml.vm ; 1
; pom.xml ; ${MODULE_INFRA_RABBITMQ}; modules/infra-rabbitmq-pom_xml.vm ; 1
; pom.xml ; ${MODULE_REST_APP} ; modules/rest-app-pom_xml.vm ; 1
; pom.xml ; ${MODULE_REST_DTO} ; modules/rest-dto-pom_xml.vm ; 1
Other example (in the bundle for "domain" module):
pom.xml file ; pom.xml ; ${MODULE_DOMAIN} ; domain-pom_xml.vm ; 1
readme file ; README.md ; ${MODULE_DOMAIN} ; domain-readme_md.vm ; 1
Entity ; Entity.java ; ${MODULE_DOMAIN}/${SRC}/${ROOT_PKG}/domain/common ; domain-common/Entity_java.vm ; 1
AggregRoot ; AggregateRoot.java ; ${MODULE_DOMAIN}/${SRC}/${ROOT_PKG}/domain/common ; domain-common/AggregateRoot_java.vm ; 1
AggregRootRepo; AggregateRootRepository.java ; ${MODULE_DOMAIN}/${SRC}/${ROOT_PKG}/domain/common ; domain-common/AggregateRootRepository_java.vm ; 1
package ${target.javaPackageFromFolder("${MODULE_DOMAIN}/${SRC}")} ;
package ${ROOT_PKG}.my.sub.pkg ;
the ending part of the package name is not supposed to change, but if you want you can also use a global variable to define it. Example:
package ${ROOT_PKG}.${DOMAIN_PKG} ;
Upvotes: 1
Reputation: 858
My current solution involves a distribution.sh
script that copies out of the src
folder to the appropriate destinations. This works fairly well as the packages that I'm writing to are unique across my modules. But if two of my modules have the same module, I'll be out of luck.
#!/bin/bash
cp -rv src/main/java/my/company/model/* service-core/src/main/java/my/company/model
cp -rv src/main/java/my/company/dao/* service-core/src/main/java/my/company/dao
cp -rv src/main/java/my/company/service/* service-core/src/main/java/my/company/service
cp -rv src/main/java/my/company/dto/* dto-public/src/main/java/my/company/dto
cp -rv src/main/java/my/company/web/v6/* api-public/src/main/java/my/company/web/v6
cp -rv src/main/java/my/company/web/integration/v6/* common-test/src/main/java/my/company/web/integration
cp -rv src/test/java/my/company/web/integration/v6/* api-public/src/test/java/my/company/web/integration/v6
Upvotes: 0
Reputation: 304
Seems like you may be looking for $target
$target.javaPackageFromFolder(String srcFolder)
Upvotes: 0