mirror of https://github.com/apache/archiva.git
[MRM-1956] Replace tomcat-jdbc pool with HikariCP
Signed-off-by: olivier lamy <olamy@apache.org>
This commit is contained in:
parent
c6d882dfdc
commit
8d3f82a479
|
@ -65,7 +65,11 @@
|
||||||
<version>${jettyVersion}</version>
|
<version>${jettyVersion}</version>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zaxxer</groupId>
|
||||||
|
<artifactId>HikariCP</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.derby</groupId>
|
<groupId>org.apache.derby</groupId>
|
||||||
<artifactId>derby</artifactId>
|
<artifactId>derby</artifactId>
|
||||||
|
@ -81,16 +85,6 @@
|
||||||
<artifactId>ant</artifactId>
|
<artifactId>ant</artifactId>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.tomcat</groupId>
|
|
||||||
<artifactId>tomcat-jdbc</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.tomcat</groupId>
|
|
||||||
<artifactId>tomcat-juli</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
|
|
@ -157,31 +157,29 @@
|
||||||
<New id="users" class="org.eclipse.jetty.plus.jndi.Resource">
|
<New id="users" class="org.eclipse.jetty.plus.jndi.Resource">
|
||||||
<Arg>jdbc/users</Arg>
|
<Arg>jdbc/users</Arg>
|
||||||
<Arg>
|
<Arg>
|
||||||
<New class="org.apache.tomcat.jdbc.pool.DataSource">
|
<New class="com.zaxxer.hikari.HikariDataSource">
|
||||||
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
|
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
|
||||||
<Set name="url">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users;create=true</Set>
|
<Set name="jdbcUrl">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users;create=true</Set>
|
||||||
<Set name="username">sa</Set>
|
<Set name="username">sa</Set>
|
||||||
<Set name="maxActive">20</Set>
|
<Set name="maximumPoolSize">20</Set>
|
||||||
<Set name="removeAbandoned">true</Set>
|
<Set name="minimumIdle">5</Set>
|
||||||
<Set name="logAbandoned">true</Set>
|
|
||||||
<Set name="initialSize">5</Set>
|
|
||||||
<Set name="testOnBorrow">true</Set>
|
|
||||||
<!-- very rigourous sql query validation -->
|
<!-- very rigourous sql query validation -->
|
||||||
<Set name="validationQuery">select 1</Set>
|
<!--Set name="connectionTestQuery">select 1</Set-->
|
||||||
</New>
|
</New>
|
||||||
</Arg>
|
</Arg>
|
||||||
</New>
|
</New>
|
||||||
|
|
||||||
|
<!--
|
||||||
<New id="usersShutdown" class="org.eclipse.jetty.plus.jndi.Resource">
|
<New id="usersShutdown" class="org.eclipse.jetty.plus.jndi.Resource">
|
||||||
<Arg>jdbc/usersShutdown</Arg>
|
<Arg>jdbc/usersShutdown</Arg>
|
||||||
<Arg>
|
<Arg>
|
||||||
<New class="org.apache.tomcat.jdbc.pool.DataSource">
|
<New class="com.zaxxer.hikari.HikariDataSource">
|
||||||
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
|
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
|
||||||
<Set name="url">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users</Set>
|
<Set name="jdbcUrl">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users</Set>
|
||||||
<Set name="username">sa</Set>
|
<Set name="username">sa</Set>
|
||||||
</New>
|
</New>
|
||||||
</Arg>
|
</Arg>
|
||||||
</New>
|
</New>
|
||||||
|
-->
|
||||||
|
|
||||||
</Configure>
|
</Configure>
|
||||||
|
|
|
@ -53,7 +53,7 @@ public class DefaultRepositoryScanner
|
||||||
@Inject
|
@Inject
|
||||||
private RepositoryContentConsumers repositoryContentConsumers;
|
private RepositoryContentConsumers repositoryContentConsumers;
|
||||||
|
|
||||||
private Set<RepositoryScannerInstance> inProgressScans = new LinkedHashSet<RepositoryScannerInstance>();
|
private Set<RepositoryScannerInstance> inProgressScans = new LinkedHashSet<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RepositoryScanStatistics scan( ManagedRepository repository, long changesSince )
|
public RepositoryScanStatistics scan( ManagedRepository repository, long changesSince )
|
||||||
|
|
|
@ -27,9 +27,11 @@ import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
|
||||||
import org.apache.archiva.mock.MockRepositorySessionFactory;
|
import org.apache.archiva.mock.MockRepositorySessionFactory;
|
||||||
import org.apache.archiva.redback.components.taskqueue.execution.TaskExecutor;
|
import org.apache.archiva.redback.components.taskqueue.execution.TaskExecutor;
|
||||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.codehaus.plexus.util.FileUtils;
|
import org.codehaus.plexus.util.FileUtils;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.springframework.test.annotation.DirtiesContext;
|
import org.springframework.test.annotation.DirtiesContext;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
@ -48,7 +50,7 @@ import static org.mockito.Mockito.mock;
|
||||||
@RunWith( ArchivaSpringJUnit4ClassRunner.class )
|
@RunWith( ArchivaSpringJUnit4ClassRunner.class )
|
||||||
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
|
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
|
||||||
@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD )
|
@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD )
|
||||||
public abstract class ArchivaRepositoryScanningTaskExecutorAbstractTest
|
public abstract class AbstractArchivaRepositoryScanningTaskExecutorTest
|
||||||
extends TestCase
|
extends TestCase
|
||||||
{
|
{
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -96,12 +98,11 @@ public abstract class ArchivaRepositoryScanningTaskExecutorAbstractTest
|
||||||
// set the timestamps to a time well in the past
|
// set the timestamps to a time well in the past
|
||||||
Calendar cal = Calendar.getInstance();
|
Calendar cal = Calendar.getInstance();
|
||||||
cal.add( Calendar.YEAR, -1 );
|
cal.add( Calendar.YEAR, -1 );
|
||||||
for ( File f : (List<File>) FileUtils.getFiles( repoDir, "**", null ) )
|
FileUtils.getFiles( repoDir, "**", null ) //
|
||||||
{
|
.stream().forEach( file -> file.setLastModified( cal.getTimeInMillis() ) );
|
||||||
f.setLastModified( cal.getTimeInMillis() );
|
|
||||||
}
|
|
||||||
// TODO: test they are excluded instead
|
// TODO: test they are excluded instead
|
||||||
for ( String dir : (List<String>) FileUtils.getDirectoryNames( repoDir, "**/.svn", null, false ) )
|
for ( String dir : FileUtils.getDirectoryNames( repoDir, "**/.svn", null, false ) )
|
||||||
{
|
{
|
||||||
FileUtils.deleteDirectory( new File( repoDir, dir ) );
|
FileUtils.deleteDirectory( new File( repoDir, dir ) );
|
||||||
}
|
}
|
|
@ -33,7 +33,7 @@ import java.util.Collection;
|
||||||
*/
|
*/
|
||||||
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
|
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
|
||||||
public class ArchivaRepositoryScanningTaskExecutorPhase1Test
|
public class ArchivaRepositoryScanningTaskExecutorPhase1Test
|
||||||
extends ArchivaRepositoryScanningTaskExecutorAbstractTest
|
extends AbstractArchivaRepositoryScanningTaskExecutorTest
|
||||||
{
|
{
|
||||||
// Split of ArchivaRepositoryScanningTaskExecutorTest should be executed first
|
// Split of ArchivaRepositoryScanningTaskExecutorTest should be executed first
|
||||||
// to avoid testConsumer in unknown state if member of Phase2 all ready executed
|
// to avoid testConsumer in unknown state if member of Phase2 all ready executed
|
||||||
|
|
|
@ -34,26 +34,23 @@ import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ArchivaRepositoryScanningTaskExecutorPhase2Test
|
* ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
|
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
|
||||||
public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
extends ArchivaRepositoryScanningTaskExecutorAbstractTest
|
extends AbstractArchivaRepositoryScanningTaskExecutorTest
|
||||||
{
|
{
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExecutorScanOnlyNewArtifacts()
|
public void testExecutorScanOnlyNewArtifacts()
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
|
createAndSaveTestStats();
|
||||||
|
|
||||||
RepositoryTask repoTask = new RepositoryTask();
|
RepositoryTask repoTask = new RepositoryTask();
|
||||||
|
|
||||||
repoTask.setRepositoryId( TEST_REPO_ID );
|
repoTask.setRepositoryId( TEST_REPO_ID );
|
||||||
repoTask.setScanAll( false );
|
repoTask.setScanAll( false );
|
||||||
|
|
||||||
createAndSaveTestStats();
|
|
||||||
|
|
||||||
taskExecutor.executeTask( repoTask );
|
taskExecutor.executeTask( repoTask );
|
||||||
|
|
||||||
// check no artifacts processed
|
// check no artifacts processed
|
||||||
|
@ -67,7 +64,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
RepositoryStatistics newStats =
|
RepositoryStatistics newStats =
|
||||||
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
||||||
assertEquals( 0, newStats.getNewFileCount() );
|
assertEquals( 0, newStats.getNewFileCount() );
|
||||||
assertEquals( 31, newStats.getTotalFileCount() );
|
assertEquals( 41, newStats.getTotalFileCount() );
|
||||||
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
||||||
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
||||||
// assertEquals( 3, newStats.getTotalGroupCount() );
|
// assertEquals( 3, newStats.getTotalGroupCount() );
|
||||||
|
@ -100,7 +97,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
RepositoryStatistics updatedStats =
|
RepositoryStatistics updatedStats =
|
||||||
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
||||||
assertEquals( 2, updatedStats.getNewFileCount() );
|
assertEquals( 2, updatedStats.getNewFileCount() );
|
||||||
assertEquals( 33, updatedStats.getTotalFileCount() );
|
assertEquals( 43, updatedStats.getTotalFileCount() );
|
||||||
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
||||||
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
||||||
// assertEquals( 3, newStats.getTotalGroupCount() );
|
// assertEquals( 3, newStats.getTotalGroupCount() );
|
||||||
|
@ -147,7 +144,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
RepositoryStatistics newStats =
|
RepositoryStatistics newStats =
|
||||||
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
||||||
assertEquals( 2, newStats.getNewFileCount() );
|
assertEquals( 2, newStats.getNewFileCount() );
|
||||||
assertEquals( 33, newStats.getTotalFileCount() );
|
assertEquals( 43, newStats.getTotalFileCount() );
|
||||||
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
||||||
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
||||||
// assertEquals( 3, newStats.getTotalGroupCount() );
|
// assertEquals( 3, newStats.getTotalGroupCount() );
|
||||||
|
@ -194,7 +191,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
RepositoryStatistics newStats =
|
RepositoryStatistics newStats =
|
||||||
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
|
||||||
assertEquals( 2, newStats.getNewFileCount() );
|
assertEquals( 2, newStats.getNewFileCount() );
|
||||||
assertEquals( 33, newStats.getTotalFileCount() );
|
assertEquals( 43, newStats.getTotalFileCount() );
|
||||||
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
|
||||||
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
// assertEquals( 8, newStats.getTotalArtifactCount() );
|
||||||
// assertEquals( 3, newStats.getTotalGroupCount() );
|
// assertEquals( 3, newStats.getTotalGroupCount() );
|
||||||
|
@ -212,8 +209,9 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
repoTask.setScanAll( true );
|
repoTask.setScanAll( true );
|
||||||
|
|
||||||
Date date = Calendar.getInstance().getTime();
|
Date date = Calendar.getInstance().getTime();
|
||||||
repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID,
|
repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, //
|
||||||
new Date( date.getTime() - 1234567 ), date, 8, 8 );
|
new Date( date.getTime() - 1234567 ), //
|
||||||
|
date, 8, 8 ); //
|
||||||
|
|
||||||
taskExecutor.executeTask( repoTask );
|
taskExecutor.executeTask( repoTask );
|
||||||
|
|
||||||
|
@ -227,17 +225,9 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
|
||||||
throws MetadataRepositoryException
|
throws MetadataRepositoryException
|
||||||
{
|
{
|
||||||
Date date = Calendar.getInstance().getTime();
|
Date date = Calendar.getInstance().getTime();
|
||||||
RepositoryStatistics stats = new RepositoryStatistics();
|
|
||||||
stats.setScanStartTime( new Date( date.getTime() - 1234567 ) );
|
|
||||||
stats.setScanEndTime( date );
|
|
||||||
stats.setNewFileCount( 31 );
|
|
||||||
stats.setTotalArtifactCount( 8 );
|
|
||||||
stats.setTotalFileCount( 31 );
|
|
||||||
stats.setTotalGroupCount( 3 );
|
|
||||||
stats.setTotalProjectCount( 5 );
|
|
||||||
stats.setTotalArtifactFileSize( 38545 );
|
|
||||||
|
|
||||||
repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID,
|
repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, //
|
||||||
new Date( date.getTime() - 1234567 ), date, 31, 31 );
|
new Date( date.getTime() - 1234567 ), date, //
|
||||||
|
41, 41 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!--
|
||||||
|
~ Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
~ or more contributor license agreements. See the NOTICE file
|
||||||
|
~ distributed with this work for additional information
|
||||||
|
~ regarding copyright ownership. The ASF licenses this file
|
||||||
|
~ to you under the Apache License, Version 2.0 (the
|
||||||
|
~ "License"); you may not use this file except in compliance
|
||||||
|
~ with the License. You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing,
|
||||||
|
~ software distributed under the License is distributed on an
|
||||||
|
~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
~ KIND, either express or implied. See the License for the
|
||||||
|
~ specific language governing permissions and limitations
|
||||||
|
~ under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
<appenders>
|
||||||
|
<Console name="console" target="SYSTEM_OUT">
|
||||||
|
<PatternLayout pattern="%d [%t] %-5p %c %x - %m%n"/>
|
||||||
|
</Console>
|
||||||
|
</appenders>
|
||||||
|
<loggers>
|
||||||
|
|
||||||
|
<logger name="org.springframework" level="error"/>
|
||||||
|
<logger name="org.apache.archiva" level="debug"/>
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
</root>
|
||||||
|
</loggers>
|
||||||
|
</configuration>
|
||||||
|
|
||||||
|
|
21
pom.xml
21
pom.xml
|
@ -79,7 +79,7 @@
|
||||||
<jackrabbit.version>2.14.1</jackrabbit.version>
|
<jackrabbit.version>2.14.1</jackrabbit.version>
|
||||||
|
|
||||||
<cxf.version>3.0.3</cxf.version>
|
<cxf.version>3.0.3</cxf.version>
|
||||||
<derbyVersion>10.10.1.1</derbyVersion>
|
<derbyVersion>10.13.1.1</derbyVersion>
|
||||||
<httpclient.version>4.5.2</httpclient.version>
|
<httpclient.version>4.5.2</httpclient.version>
|
||||||
<httpclient.core.version>4.4.4</httpclient.core.version>
|
<httpclient.core.version>4.4.4</httpclient.core.version>
|
||||||
<javaxMailVersion>1.4</javaxMailVersion>
|
<javaxMailVersion>1.4</javaxMailVersion>
|
||||||
|
@ -95,7 +95,6 @@
|
||||||
<plexus-digest.version>1.1</plexus-digest.version>
|
<plexus-digest.version>1.1</plexus-digest.version>
|
||||||
<plexus-expression-evaluator.version>2.1</plexus-expression-evaluator.version>
|
<plexus-expression-evaluator.version>2.1</plexus-expression-evaluator.version>
|
||||||
<plexus-utils.version>3.0.15</plexus-utils.version>
|
<plexus-utils.version>3.0.15</plexus-utils.version>
|
||||||
<tomcat7Version>7.0.54</tomcat7Version>
|
|
||||||
<htmlUnitVersion>2.27</htmlUnitVersion>
|
<htmlUnitVersion>2.27</htmlUnitVersion>
|
||||||
|
|
||||||
<release.preparationGoals>clean install</release.preparationGoals>
|
<release.preparationGoals>clean install</release.preparationGoals>
|
||||||
|
@ -460,7 +459,13 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.lmax</groupId>
|
<groupId>com.lmax</groupId>
|
||||||
<artifactId>disruptor</artifactId>
|
<artifactId>disruptor</artifactId>
|
||||||
<version>3.2.1</version>
|
<version>3.3.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.zaxxer</groupId>
|
||||||
|
<artifactId>HikariCP</artifactId>
|
||||||
|
<version>2.6.3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
@ -644,16 +649,6 @@
|
||||||
<artifactId>commons-lang</artifactId>
|
<artifactId>commons-lang</artifactId>
|
||||||
<version>${commons-lang.version}</version>
|
<version>${commons-lang.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.tomcat</groupId>
|
|
||||||
<artifactId>tomcat-jdbc</artifactId>
|
|
||||||
<version>${tomcat7Version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.tomcat</groupId>
|
|
||||||
<artifactId>tomcat-juli</artifactId>
|
|
||||||
<version>${tomcat7Version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-compress</artifactId>
|
<artifactId>commons-compress</artifactId>
|
||||||
|
|
Loading…
Reference in New Issue