问题
I have recently hosted a mule application in Maven Central Repo. The app contains two java files and a dwl file. The dwl file uses those java files to do some operation. This is the primary app (app1) which I want to reference in another app (app2 )as a pom dependency.
The name of the primary is encryption-1.0.5-mule-application.jar
.
The name of dwl script which it contains is encryption.dwl
.
The Java files are available in the jar file /company
package.
Case 1: If I package this primary mule app (app1) as a jar and install the app into my local .m2 repo, and later include this as pom dependency and a shared library for mule-maven-plugin of another secondary mule app (app2). The app2 is able to recognize the dwl script and it works when deployed.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-maven-plugin</artifactId>
<version>${mule.maven.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<sharedLibraries>
<sharedLibrary>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
</sharedLibrary>
</sharedLibraries>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
<version>1.0.5</version>
</dependency>
<dependencies>
Case 2:
If I include the app1 dependency in the app2 pom.xml file with a scope as <system>
, include a <systemPath="jarfilelocation/app1.jar"> in it and add a shared library, then the jar gets added to the root folder of app2, and everything works when deployed.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-maven-plugin</artifactId>
<version>${mule.maven.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<sharedLibraries>
<sharedLibrary>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
</sharedLibrary>
</sharedLibraries>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
<version>1.0.5</version>
<scope>system</scope>
<systemPath>${project.basedir}/encryption-1.0.5-mule-application.jar</systemPath>
</dependency>
<dependencies>
Case 3:
If I include the app1 as a dependency in the app2 pom.xml with a scope as <provided>
, and add a shared library, the jars gets downloaded from upstream and gets added into the Project Libraries of app2. But the app2 doesn't recognizes the dwl script available in the Project Libraries. Without adding a scope the pom invalidates the deployment, leading to failure.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-maven-plugin</artifactId>
<version>${mule.maven.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<sharedLibraries>
<sharedLibrary>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
</sharedLibrary>
</sharedLibraries>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
<version>1.0.5</version>
<scope>provided</scope>
</dependency>
<dependencies>
My aim is to get the app2 to recognize the app1's dwl file and all the other files which are automatically added by the Studio into the Project Libraries (PL) of the app2's mule package explorer, once after successfully downloading the jars using the pom dependency we added.
I can already see all of the app1 files available under the encryption-1.0.5-mule-application.jar
in the PL of app2, which was fetched using the pom dependency.
Still I couldn't get those files recognised in the app2 mule XML dataweave. I need help figuring this out.
Note: I also included all sorts of combinations using the mule-artifact.json
{
"name": "MyApp",
"minMuleVersion": "4.3.0",
"classLoaderModelLoaderDescriptor": {
"id": "mule",
"attributes": {
"exportedPackages": [
"company"
],
"exportedResources": [
"encryption/encryption.dwl",
"encryption.dwl",
"*/encryption.dwl",
"company/encryption.dwl"
]
}
}
}
回答1:
I don't think Studio will recognize the files inside a dependency. You need to edit the original project (ie app1).
By the way, to package correctly an application for shared use you might want to read https://help.mulesoft.com/s/article/How-to-add-a-call-to-an-external-flow-in-Mule-4.
回答2:
I have resolved this problem.
At first I believed that the <scope>provided</scope>
is somehow causing the issue. I didn't fully understood the concept of scopes. I also tried passing <classifier>mule-application<classifier>
. It didn't made sense that classifier cannot be of the above mentioned type mule-application
. This is got to know when I tried playing with the classifier as mule-plugin
and renaming the local repository jars which I previously downloaded and redeploying my mule app in studio.
Actually the problem is the name of the jar I have published to the OSSRH. It is not valid to package a jar with value as mule-application
.
Like this <packaging>mule-application</packaging>
I later published the release with an altered pom.xml where <packaging></packaging>
is set to jar
. I also removed the mule-maven-plugin
since it is not allowing the packaging with type jar
. Note: This is App1.
Once publishing upstream, I simply referred to the generated Nexus dependency of App1 in App2 and it worked fine.
Now there is also no need to pass a Shared Library Dependency as below in App2. Also you dont need to add anything to the mule-artifact.json
.
<plugin>
<groupId>org.mule.tools.maven</groupId>
<artifactId>mule-maven-plugin</artifactId>
<version>${mule.maven.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<sharedLibraries>
<sharedLibrary>
<groupId>com.github.xyz</groupId>
<artifactId>encryption</artifactId>
</sharedLibrary>
</sharedLibraries>
</configuration>
</plugin>
来源:https://stackoverflow.com/questions/65264158/unable-to-reference-to-dwl-script-files-in-mule-4-dataweave-from-project-librari