我有一个带有一些本地依赖项的Heroku应用程序,我通过以下命令安装了它:
mvn install:install-file -Dfile="libcomsforcesoappartner1.0partner-1.0.jar" -DgroupId="com.sforce.soap.partner" -DartifactId=partner -Dversion="1.0" -Dpackaging=jar
有了这个,我做了一个mvn包和一个干净的安装,我的应用程序在我的本地环境中运行得很完美。我遇到的问题是,当我试图将这个应用程序部署到Heroku时,因为它失败了;无法解决依赖关系错误";(尤其是在partner.jar依赖关系中失败(。我试着用以前的命令在heroku控制台中安装我的jar,但它说找不到mvn命令。
我能做些什么来解决这个问题?这是我的pom:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.aisfg</groupId>
<artifactId>ais-salesforce-heroku-bloomber</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<assembleDirectory>target</assembleDirectory>
<programs>
<program>
<mainClass>Service</mainClass>
<name>service</name>
</program>
</programs>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.force.api/force-wsc -->
<dependency>
<groupId>com.force.api</groupId>
<artifactId>force-wsc</artifactId>
<version>35.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mozilla/rhino -->
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino</artifactId>
<version>1.7.12</version>
</dependency>
<!-- https://www.stringtemplate.org/ -->
<dependency>
<groupId>org.antlr</groupId>
<artifactId>ST4</artifactId>
<version>4.0.8</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20200518</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
<!-- LOCAL DEPENDENCIES -->
<dependency>
<groupId>com.bloomberglp.blpapi</groupId>
<artifactId>blpapi</artifactId>
<version>3.12.1</version>
</dependency>
<dependency>
<groupId>com.sforce.soap.partner</groupId>
<artifactId>partner</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.sforce.soap.enterprise</groupId>
<artifactId>enterprise</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<!-- <repositories>
<repository>
<id>project_lib</id>
<name>Repository in project's lib dir</name>
<layout>default</layout>
<url>file:///${project.basedir}/lib</url>
</repository>
</repositories> -->
mvn install:install-file
在本地存储库中安装依赖项(默认情况下((在Linux/macOS下默认为~/.m2/repository
(。这将使Maven在您的本地机器上可以使用依赖项,但在Heroku中的构建过程中不会使用。
在Herkou控制台中使用此命令也将不起作用(如果mvn
可用(,原因如下:
- Heroku Dynos的文件系统是短暂的
- 控制台为编译的应用程序运行,而不是为构建系统运行
但是,您可以让它工作。这需要将JAR文件签入Git,以便Heroku在构建过程中可以访问它。这有一个缺点:如果你经常更新文件,你的回购规模会迅速增长,因为Git不能再只存储版本之间的增量。然而,我认为这似乎是一个合理的用例。
- 将指向项目目录中某个目录的新存储库添加到
pom.xml
中:
<repositories>
<repository>
<id>local-maven-repository</id>
<url>file:///${project.basedir}/maven-repository</url>
</repository>
</repositories>
- 创建该目录(确保在项目目录中运行所有命令(:
mkdir maven-repository
- 将您的工件部署到该存储库:
mvn deploy:deploy-file -DgroupId=com.sforce.soap.partner -DartifactId=partner -Dversion=1.0 -Durl=file:./maven-repository/ -DrepositoryId=local-maven-repository -DupdateReleaseInfo=true -Dfile=libcomsforcesoappartner1.0partner-1.0.jar
- 将您的更改和依赖JAR添加到Git并部署到Heroku:
git add .
git commit -m "Add local dependency"
git push heroku master
如果你不想签入你的二进制文件,你必须有一个可远程访问的Nexus回购与你的依赖关系。您可以使用密码保护它,并在Heroku上进行设置:https://devcenter.heroku.com/articles/using-a-custom-maven-settings-xml#using-密码保护存储库