Как отлаживать плагин maven без его переустановки?
Я новичок в разработке плагинов maven и использую IntelliJ IDEA для разработки своих плагинов, и я всегда использую удаленную отладку для отладки плагина maven. Я устанавливаю параметры VM в конфигурации запуска плагина и устанавливаю конфигурацию запуска Maven в тестовом проекте, как это делают большинство разработчиков плагинов maven.
Однако, если я изменяю какой-то код плагина maven, мне нужно остановить процесс отладки и переустановить плагин maven, что занимает очень много времени, если мой плагин maven крупномасштабный. После этого запускаю "отладку" в maven-плагине и запускаю "прогон" в тестовом проекте.
Поэтому я попытался использовать maven-plugin-testing-harness, чтобы написать тестовый код для моего плагина, например:
<dependency>
<groupId>org.apache.maven.plugin-testing</groupId>
<artifactId>maven-plugin-testing-harness</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>
public class Maven3MojoTest extends AbstractMojoTestCase {
private File localRepoDir = new File("C:\\Users\\buriedpot\\.m2\\repository");
private static final String POM_FILE_NAME = "src/test/resources/A/pom.xml";
private static final String PROJ_DIR_NAME = "src/test/resources/A";
@Rule
public MojoRule rule = new MojoRule()
{
@Override
protected void before() throws Throwable
{
}
@Override
protected void after()
{
}
};
/**
* @throws Exception if any
*/
@Test
public void testSomething()
throws Exception
{
File pom = new File(POM_FILE_NAME);
Assert.assertNotNull( pom );
Assert.assertTrue( pom.exists() );
MavenProject project = rule.readMavenProject(new File(PROJ_DIR_NAME));
MavenSession session = rule.newMavenSession(project);
ArtifactRepository localRepository = createLocalArtifactRepository();
session.getRequest().setLocalRepository(localRepository);
DefaultRepositorySystemSession systemSession = MavenRepositorySystemUtils.newSession();
DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
locator.addService(TransporterFactory.class, FileTransporterFactory.class);
locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
RepositorySystem system = locator.getService(RepositorySystem.class);
LocalRepository local = new LocalRepository(localRepoDir);
systemSession.setLocalRepositoryManager(system.newLocalRepositoryManager(systemSession, local));
MojoExecution execution = newMojoExecution("maven3Mojo");
Maven3Mojo mojo = (Maven3Mojo) lookupConfiguredMojo(session, execution);
Assert.assertNotNull( mojo );
mojo.repoSession = systemSession;
mojo.execute();
}
/**
* Generate a local repository
* @return local repository object
*/
private ArtifactRepository createLocalArtifactRepository() {
return new MavenArtifactRepository("local",
localRepoDir.toURI().toString(),
new DefaultRepositoryLayout(),
new ArtifactRepositoryPolicy( true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE ),
new ArtifactRepositoryPolicy( true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE )
);
}
/** Do not need the MojoRule. */
@WithoutMojo
@Test
public void testSomethingWhichDoesNotNeedTheMojoAndProbablyShouldBeExtractedIntoANewClassOfItsOwn()
{
}
}
И затем я ожидаю, что смогу запустить указанный тест в режиме отладки, чтобы найти способ отладки без переустановки моего плагина. Однако некоторые компоненты моего Mojo не вводятся.
@Mojo(name = "maven3Mojo", defaultPhase = LifecyclePhase.VALIDATE)
public class Maven3Mojo extends AbstractMojo {
@Parameter(defaultValue = "${session}", readonly = true, required = true)
public MavenSession session;
@Component
public DependencyGraphBuilder dependencyGraphBuilder;
@Parameter(defaultValue = "${localRepository}", readonly = true)
public ArtifactRepository localRepository;
@Parameter(defaultValue = "${project}", readonly = true, required = true)
public MavenProject project;
@Parameter(defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true)
public List<ArtifactRepository> remoteRepositories;
@Parameter(defaultValue = "${repositorySystemSession}", readonly = true, required = true)
public RepositorySystemSession repoSession;
}
Хотя я сослался на ответ maven-plugin-testing-harness session.getLocalRepository() возвращает null , в компоненте "repoSession" по-прежнему отсутствуют некоторые критические атрибуты...
Таким образом, похоже, что тест жгута не может правильно внедрить все необходимые компоненты в Maven Mojo. Итак, можно ли использовать какие-либо другие подходы для отладки без сложной процедуры переустановки?